我必须拖曳具有相同属性(列名称)但关系不相同的表客户和合作伙伴。
关系如下:
只有客户有一个帐户。
一个客户只能有一个合作伙伴。
客户有专业。
合伙人有专业。
我的解决方案:
1
创建一个包含所有带有外键(customer_id
)属性的表格(用户),以引用合作伙伴的相关客户,
所以:
客户是具有({account_id
)NOT NULL
和(Customer_id
)NULL
的用户
而合作伙伴是具有({account_id
)NULL
和(Customer_id
)NOT NULL
的用户。
2
分别为客户和合作伙伴创建两个表,并将外键放在合作伙伴表中以引用其相关客户。
3
创建包含所有通用属性的基表,并在“客户表”和“合作伙伴表”中添加外键以引用此表。
我想知道哪种方法正确。
答案 0 :(得分:0)
我是说你误会了一些东西。您强迫性地尝试合并不同实体(客户,合作伙伴)的属性。您可能想要或应该做的是规范化数据。 (因此您已经有了一些关键字可以做进一步的研究)。
客户不是合伙人,另一个实体。如果要像解决方案1中那样将所有内容放入表中,则首先,名称“ User”会引起误解。其次,您必须插入一个指定类型的属性(例如EntityType(客户,合作伙伴)并引用一个单独的表)。您关于某项是否为NULL的建议很容易出错,并且没有其他人会理解(三个月后您也不会)。如果业务逻辑发生变化,从而使合作伙伴可以登录,那么您已经遇到了问题。
学习愉快... =) “教一个人钓鱼,你就让他终身难忘”
答案 1 :(得分:-1)
我建立模型时没有查看您建议的模型,最后得出的结果非常接近您的2号模型。唯一的区别是,我将PartnerID作为外键放在Customer表中。你却相反。这是一个选择的问题,合作伙伴是否“反过来”拥有“客户”?我以相反的方式看到了它。
对于您的第一人:您正在尝试将应用程序逻辑放入数据库模型中,但我不会这样做。容易出现数据完整性问题(例如,您最终同时拥有两个字段均为==空的用户!)。
对于您的第3项:我知道您想“隔离”公共字段,但是如果表User中的值无论如何都不会被重用,那么我看不到这一点。您将始终为每个客户有1行,为每个合作伙伴有1行。表格中也可以包含它。仅在您永远没有客户和合作伙伴是同一个人的情况下有效。