在MySql中如何设计具有相同列但关系不同的两个表

时间:2018-08-03 13:04:32

标签: mysql database-design

我必须拖曳具有相同属性(列名称)但关系不相同的表客户合作伙伴

关系如下:

只有客户有一个帐户。

一个客户只能有一个合作伙伴。

客户有专业。

合伙人有专业。

我的解决方案

1

enter image description here

创建一个包含所有带有外键(customer_id)属性的表格(用户),以引用合作伙伴的相关客户, 所以:

客户是具有({account_idNOT NULL和(Customer_idNULL的用户 而合作伙伴是具有({account_idNULL和(Customer_idNOT NULL的用户。

2

enter image description here

分别为客户和合作伙伴创建两个表,并将外键放在合作伙伴表中以引用其相关客户。

3

enter image description here

创建包含所有通用属性的基表,并在“客户表”和“合作伙伴表”中添加外键以引用此表。

我想知道哪种方法正确。

2 个答案:

答案 0 :(得分:0)

我是说你误会了一些东西。您强迫性地尝试合并不同实体(客户,合作伙伴)的属性。您可能想要或应该做的是规范化数据。 (因此您已经有了一些关键字可以做进一步的研究)。

客户不是合伙人,另一个实体。如果要像解决方案1中那样将所有内容放入表中,则首先,名称“ User”会引起误解。其次,您必须插入一个指定类型的属性(例如EntityType(客户,合作伙伴)并引用一个单独的表)。您关于某项是否为NULL的建议很容易出错,并且没有其他人会理解(三个月后您也不会)。如果业务逻辑发生变化,从而使合作伙伴可以登录,那么您已经遇到了问题。

学习愉快... =) “教一个人钓鱼,你就让他终身难忘”

答案 1 :(得分:-1)

我建立模型时没有查看您建议的模型,最后得出的结果非常接近您的2号模型。唯一的区别是,我将PartnerID作为外键放在Customer表中。你却相反。这是一个选择的问题,合作伙伴是否“反过来”拥有“客户”?我以相反的方式看到了它。

对于您的第一人:您正在尝试将应用程序逻辑放入数据库模型中,但我不会这样做。容易出现数据完整性问题(例如,您最终同时拥有两个字段均为==空的用户!)。

对于您的第3项:我知道您想“隔离”公共字段,但是如果表User中的值无论如何都不会被重用,那么我看不到这一点。您将始终为每个客户有1行,为每个合作伙伴有1行。表格中也可以包含它。仅在您永远没有客户和合作伙伴是同一个人的情况下有效。

相关问题