我有一个表,它只包含 id 和一个数据是数据列表的字段。例如
-------------- | 编号 | 数据 | | 1 | a,b,c,d| | 2 | a,b,k,m| ---------------
我想将列表数据放在字段中并不是一个好的设计,所以我想知道如何重新设计它?
我有一个表,它只包含 id 和一个数据是数据列表的字段。例如
-------------- | 编号 | 数据 | | 1 | a,b,c,d| | 2 | a,b,k,m| ---------------
我想将列表数据放在字段中并不是一个好的设计,所以我想知道如何重新设计它?
根据我的说法,只有当每条记录的某些细节都相同并且有些会发生变化时,您才需要两个表,即主表和事务表。在您的情况下,如果没有任何其他与您的 id 字段相关的事情将是相同的,您可以继续使用一张表并使用以下结构。
--------------
| id | data |
| 1 | a |
| 1 | b |
| 1 | c |
| 1 | d |
| 2 | a |
| 2 | b |
| 2 | k |
| 2 | m |
---------------
但是,如果有任何其他与 id 字段相关的东西对于相同的 id 记录将是相同的,那么您将不得不使用两个表。像下面的案例。有 3 个字段 id、name 和 data。你当前的表格看起来像
--------------------------
| 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 个表格,如下所示
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
您将需要另一个可以是该ONE to MANY
类型的表。
例如,您可以拥有另一个表数据映射,该表数据映射将具有列data
与数据表列之间的列。ID
ID
FOREIGN KEY
ID
因此,根据您的示例,数据ID = 1
映射表中将有 4 个条目。
你是对的,这不是一个好的数据库设计。该data
字段违反了原子性原则,因此违反了 1NF,这可能导致维护和查询数据时出现问题。
要标准化您的设计,请将原始表格一分为二。有两种基本策略可以做到这一点:使用非识别和使用识别关系。
注意:如果您只有id
在父表中,并且没有其他 FK,并且父表不能在没有至少一个子表的情况下存在(即data
在原始设计中不能为空),您可以完全省略父表。
您将需要两个带有外键的表。
表 1 编号
表2 id数据值
所以数据看起来像:
表格1:
id
1
2
3
表 2:
id | data
1 | a
1 | b
1 | c
1 | d
2 | a
2 | b
2 | k
2 | m