2012-06-11 32 views
2

我有一个只包含id和一个数据是数据列表的字段的表。例如mysql:如何拆分列表字段

 
-------------- 
| id | data | 
| 1 | a,b,c,d| 
| 2 | a,b,k,m| 
--------------- 

我想这不是一个很好的设计,把列表数据在一个领域,所以我想知道我可以重新设计呢?

+0

你的表只有这两个字段? –

回答

2

按照我的说法,你需要两张表,即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 | 
    --------------- 

为了更好的数据库管理,我们可能需要标准化的数据。 数据库规范化是组织关系数据库的字段和表的过程,以最大限度地减少冗余和依赖关系。规范化通常涉及将大型表分成更小(更少冗余)的表并定义它们之间的关系。其目标是隔离数据,以便可以在一个表中添加,删除和修改字段,然后通过定义的关系通过数据库的其余部分进行传播。你可以找到更多在下面的链接

  1. 3 Normal Forms Database Tutorial

  2. Database normalization

+0

谢谢,现在我知道为什么它应该分成两张表。 – remy

0

您将需要两个带有外键的表。

表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 
+0

你能解释为什么它是一个好的设计? – remy

+0

保持身份证在一张桌子是好设计? –

+0

@FahimParkar根据需求,它可以是一个很好的设计,就像您的设计可以,也取决于需求。请参阅[我的答案](http://stackoverflow.com/a/10976482/533120)以了解在决定使用哪两种方法时应考虑的事项列表。 +1来计数不当-1。 –

0

您需要另一个表格,该表格可以是ONE to MANY类型。

例如,您可以使用另一个表格数据映射,其中dataID列,其中ID列为FOREIGN KEY至数据表格的ID列。

因此根据您的示例,数据映射表中将有4个条目用于ID = 1

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 
0

你是正确的,这这不是一个良好的数据库设计。 data字段违反了原则atomicity,因此1NF,这可能会导致维护和查询数据的问题。

要正常化您的设计,请将原始表分成两部分。有两个基本策略可以做到这一点:using non-identifying and using identifying relationship


注意:如果你只有id父表,并在其上没有其他FKS,没有至少有一个孩子家长可以不存在(即data不可能在最初的设计一直是空的),你可以完全省去父表。