Postgresql

正確使用表中的數組?同一欄位和記錄的多個元素

  • September 21, 2016

考慮到另一個程序中的一些使用者輸入,我有一組處理優先級每天都在變化。每個優先級都有一個項目和一組分配給它的名稱。名稱可以跨優先級重複,並且每個優先級通常有多個名稱。有沒有更好的方法來組織我的優先級表?我是否出於正確的原因使用該陣列?請注意,name_idpriorities表中的欄位是一個數組。該數組可以是 2500 個元素長。我在 PostgreSQL 中這樣做。很高興提供更多細節。

names

+---------+------+
| name_id | name |
+---------+------+
|       1 | bob  |
|       2 | joe  |
|       3 | ben  |
+---------+------+

items

+---------+--------+
| item_id |  item  |
+---------+--------+
|       1 | sticks |
|       2 | stones |
|       3 | cars   |
|       4 | buses  |
+---------+--------+

priorities

+----------+---------+---------+
| priority | item_id | name_id |
+----------+---------+---------+
|        1 |       1 | [2,3]   |
|        2 |       3 | [1]     |
|        3 |       4 | [1,2,3] |
+----------+---------+---------+

這不遵循第一範式(1NF)。您的priorities表應包含每行priorityitem_idname_id

+----------+---------+---------+
| priority | item_id | name_id |
+----------+---------+---------+
|        1 |       1 |       2 |
|        1 |       1 |       3 |
|        2 |       3 |       1 |
|        3 |       4 |       1 |
|        3 |       4 |       2 |
|        3 |       4 |       3 |
+----------+---------+---------+

這將使name_idpriority/item_id組合中輸入或刪除 a 變得更加容易。所有 3 個欄位都應構成主鍵,以防止重複輸入。

如果您需要name_id在數組中,那麼您始終可以為此目的創建一個視圖。

引用自:https://dba.stackexchange.com/questions/150299