我有一個只包含id和一個數據是數據列表的字段的表。例如mysql:如何拆分列表字段
-------------- | id | data | | 1 | a,b,c,d| | 2 | a,b,k,m| ---------------
我想這不是一個很好的設計,把列表數據在一個領域,所以我想知道我可以重新設計呢?
我有一個只包含id和一個數據是數據列表的字段的表。例如mysql:如何拆分列表字段
-------------- | id | data | | 1 | a,b,c,d| | 2 | a,b,k,m| ---------------
我想這不是一個很好的設計,把列表數據在一個領域,所以我想知道我可以重新設計呢?
按照我的說法,你需要兩張表,即Master和Transaction表,只有當某些細節對於每個記錄都是相同的,並且有些將會改變時。在你的情況下,如果沒有任何其他與你的id字段相關的東西會相同,你可以繼續使用一張桌子和以下結構。
--------------
| id | data |
| 1 | a |
| 1 | b |
| 1 | c |
| 1 | d |
| 2 | a |
| 2 | b |
| 2 | k |
| 2 | m |
---------------
但是如果有相關的ID字段是會是相同的ID相同的記錄,你將不得不使用兩個表的任何其他東西。 像下面這種情況。有3個字段的ID,名稱和數據。 你當前表看起來像
--------------------------
| id | name | data |
| 1 | testname | a,b,c,d|
| 2 | remy | a,b,c,d|
--------------------------
新的表結構應該像。
表1主
-----------------
| id | name |
| 1 | testname |
| 2 | remy |
-----------------
表2事務
--------------
| id | data |
| 1 | a |
| 1 | b |
| 1 | c |
| 1 | d |
| 2 | a |
| 2 | b |
| 2 | k |
| 2 | m |
---------------
爲了更好的數據庫管理,我們可能需要標準化的數據。 數據庫規範化是組織關係數據庫的字段和表的過程,以最大限度地減少冗餘和依賴關係。規範化通常涉及將大型表分成更小(更少冗餘)的表並定義它們之間的關係。其目標是隔離數據,以便可以在一個表中添加,刪除和修改字段,然後通過定義的關係通過數據庫的其餘部分進行傳播。你可以找到更多在下面的鏈接
謝謝,現在我知道爲什麼它應該分成兩張表。 – remy
您將需要兩個帶有外鍵的表。
表1 ID
表2 ID datavalue
所以數據的模樣:
表1:
id
1
2
3
表2:
id | data
1 | a
1 | b
1 | c
1 | d
2 | a
2 | b
2 | k
2 | m
你能解釋爲什麼它是一個好的設計? – remy
保持身份證在一張桌子是好設計? –
@FahimParkar根據需求,它可以是一個很好的設計,就像您的設計可以,也取決於需求。請參閱[我的答案](http://stackoverflow.com/a/10976482/533120)以瞭解在決定使用哪兩種方法時應考慮的事項列表。 +1來計數不當-1。 –
您需要另一個表格,該表格可以是ONE to MANY
類型。
例如,您可以使用另一個表格數據映射,其中data
和ID
列,其中ID
列爲FOREIGN KEY
至數據表格的ID
列。
因此根據您的示例,數據映射表中將有4個條目用於ID = 1
。
如果您只有在表中的兩個字段,那麼你應該只有1表如下
id | data
複合主鍵爲PRIMARY KEY(id,data)
,這樣就不會有相應ID的任何重複數據。
的數據會是這樣
id | data
1 | a
1 | b
1 | c
1 | d
2 | a
2 | b
2 | k
2 | m
你是正確的,這這不是一個良好的數據庫設計。 data
字段違反了原則atomicity,因此1NF,這可能會導致維護和查詢數據的問題。
要正常化您的設計,請將原始表分成兩部分。有兩個基本策略可以做到這一點:using non-identifying and using identifying relationship。
注意:如果你只有id
父表,並在其上沒有其他FKS,沒有至少有一個孩子家長可以不存在(即data
不可能在最初的設計一直是空的),你可以完全省去父表。
你的表只有這兩個字段? –