冗余列

时间:2010-07-21 18:05:28

标签: sql database-design

我有一个有两个表的数据库,这些表看起来像这样

codes
id | code | member_id
1  | 123  | 2
2  | 234  | 1
3  | 345  |  
4  | 456  | 3

members
id | code_id | other info
1  | 2       | blabla
2  | 1       | blabla
3  | 4       | blabla

基本思想是,如果采用代码,则填写其成员id字段,但这是创建一个圆形链接(成员指向代码,代码指向成员)是否有不同的方式来执行此操作?这实际上是件坏事吗?

<小时/>的更新
要回答你的问题,有三个不同的代码表,每个代码表大约有350万个代码,每个表都根据不同的标准进行搜索,如果member_id列为空则代码无人认领,否则代码被声明,这样做是为了使当我们搜索数据库时,我们不需要包含另一个表来判断它是否声称它。

成员表包含每个代码的索赔人,因此所有成员都是1050万 其他信息包括移动,flybuys等。

移动设备是我们识别会员的方式,但每个条目都被视为不同的会员。

7 个答案:

答案 0 :(得分:3)

这是一件坏事,因为你最终会遇到异常。例如:

codes
id | code | member_id
1  | 123  | 2

members
id | code_id | other info
2  | 4       | blabla

看到异常?代码1引用其相应的成员,但该成员不会引用相同的代码作为回报。异常的问题是你无法分辨哪一个是正确的,有意的参考,哪一个是错误的。

消除冗余列可减少异常的可能性。这是一个简单的过程,遵循一些定义明确的规则,称为rules of normalization

在您的示例中,我将删除codes.member_id列。我推断成员必须引用代码,但代码不一定引用成员。所以我会members.code_id引用codes.id。但它可以走另一条路;你没有给读者足够的信息(正如@OMG小马评论的那样)。

答案 1 :(得分:1)

是的,这不好,因为它为数据完整性问题提供了机会。你有一对一的关系,所以要么从成员表中删除Code_id,要么从代码表中删除member_id。 (在这种情况下,从成员中删除code_id似乎更有意义,因为听起来你更频繁地查询代码以查看哪些代码未分配而不是查询成员以查看哪些代码没有代码,但是你可以打那个电话)

答案 2 :(得分:0)

您可以简单地删除member_id列并使用外键关系(或其缺席)来表示关系或缺少关系。然后将code_id列用作代码的外键。就我个人而言,我确实认为这很糟糕,因为它确保你在数据库中没有腐败的关系会更加有效 - 也就是说,你必须检查这两个列在表之间是否同步 - 而且它没有'在一般情况下真的添加任何东西。如果遇到性能问题,那么你可能需要进行非规范化,但是我要等到它确实存在问题(在这种情况下你可能会复制的不仅仅是id。)

答案 3 :(得分:0)

这取决于你在做什么。如果每个成员总是只获得一个唯一代码,那么只需将实际代码放在成员表中即可。

如果有一组代码和几个成员共享代码(但每个成员仍然只有一个),则从代码表中删除member_id并仅存储唯一代码。通过成员访问特定代码。 (您仍然可以加入代码表来搜索代码)

如果成员可以有多个代码,则从成员表中删除code_id,代码表中的member_id可以创建第三个表,将成员与代码相关联。成员表中的每条记录都应该是唯一的记录,代码表中的每条记录都应该是唯一的记录。

答案 4 :(得分:0)

在代码表中使用成员代码背后的逻辑是什么?

这是不必要的,因为如果您需要两条信息,您总是可以进行加入。

通过使用它,您可以创建完整性问题的可能性,因为您需要在进行更新时更新BOTH表。

答案 5 :(得分:0)

是的,这是一个坏主意。如果可以提供帮助,切勿将数据库设置为具有循环引用。现在,必须对这两个地方进行任何更改,如果错过了一个地方,则会出现严重的数据完整性问题。

第一个问题是,每个代码可以分配给多个成员吗?或者每个成员可以有多个代码吗? (这包括随着时间的推移以及在任何一个时刻,如果你需要历史记录,谁有什么代码时))如果答案是肯定的,那么你当前的结构是行不通的。如果两者的答案都是否定的,为什么还需要两个表?

如果你有多个代码和多个成员,你需要一个具有memberid和代码id的桥接表。如果您可以为多个成员分配一个代码,请将代码ID放在members表中。如果是另一种方式,它应该是代码表中的memberid。然后正确设置外键关系。

答案 6 :(得分:0)

@Bill Karwin正确地将此识别为可能导致异常的设计缺陷。

假设codemember是不同的实体,我会创建一个thrid表...

codemember之间的关系是什么? oath?如果这是一种现实生活中的关系,那么拥有该领域知识的人将能够为其命名。如果不寻找进一步的设计缺陷:

oaths
code_id | member_id
1       | 2
2       | 1
4       | 3

数据表明(code_id, member_id)需要一个唯一约束。

数据被“清除”后,请删除codes.member_idmembers.code_id列。