我有一个只包含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
不可能在最初的设计一直是空的),你可以完全省去父表。
你的表只有这两个字段? –