SQL关系

时间:2011-07-15 09:22:18

标签: entity-relationship

我正在使用MS SQL Server 2008R2,但我相信这与数据库无关。

我正在重新设计我的一些sql结构,我正在寻找建立1对多关系的最佳方法。

我有3个表,公司,供应商和实用程序,其中任何一个都可以与另一个名为VanInfo的表有1对多的关系。

货车信息记录可以属于公司,供应商或公用事业。

我最初在VanInfo表中有一个指向公司表的company_id,但是当我添加供应商时,他们也需要vaninfo记录,所以我在vanInfo中为supplier_id添加了另一列,并设置了supplier_id的约束或者company_id已设置,另一个为null。

现在我添加了Utilities,现在他们需要访问VanInfo表,我意识到这不是最佳结构。

建立这些关系的正确方法是什么?或者我应该继续添加外键到VanInfo表?或者设置某种交叉引用表。

该应用程序在技术上尚未生效,但我想确保使用最佳实践进行设置。

更新 感谢您的所有快速回复。

我已阅读所有建议,检查了所有链接。我的主要标准是易于修改和维护的东西,因为客户要求总是倾向于在没有太多注意的情况下改变。在研究,研究和规划之后,我认为最好使用名为Organizations的各种交叉参考表,以及公司/公用事业/供应商和组织表之间的1对1关系,从而与Vaninfo表保持清晰的关系。这将很容易维护,并且仍然可以正确建模我的业务对象。

enter image description here

4 个答案:

答案 0 :(得分:2)

以你的例子为例,我总是选择“某种交叉引用表” - 在VanInfo表中添加列气味。

最终你的SP会有更多的加入,但我认为开销是值得的。

答案 1 :(得分:1)

设计数据库时,不应考虑主键/外键的位置,因为这些概念不属于设计阶段。我知道这听起来很奇怪,但你也不应该考虑桌子! (您可以使用XML / Files / Whatever实现您的E / R模型 坚持E / R关系设计你应该只识别你的实体(在你的情况下是公司/供应商/公用事业/ vanInfo),然后考虑它们之间有什么样的关系(如果有的话)。例如,您说公司可以有一个或多个VanInfo,但Van Info只能属于一个公司。我们正在谈论你已经猜到的一对多关系。此时,当您将设计模型(一对多关系)“转换”为数据库表时,您将知道将键/外键放在何处。在一对多关系的情况下,外键应该转到“许多”方面。在这种情况下,van info将拥有公司的外键(因此vaninfo表将包含公司ID)。你必须按照这种方式对所有其他表

请看下面的链接:

https://homepages.westminster.org.uk/it_new/BTEC%20Development/Advanced/Advanced%20Data%20Handling/ERdiagrams/build.htm

答案 2 :(得分:1)

您的数据库基本上需要规范化,我认为您的数据库应该是第五种正常形式,其中有两个表由一个表链接。请参阅此文章,这将对您有所帮助:

http://en.wikipedia.org/wiki/Fifth_normal_form

您可能还希望看到这一点,数据库规范化:

http://en.wikipedia.org/wiki/Database_normalization

答案 3 :(得分:1)

考虑将ComSupUtil PK设为GUID,这应该足以解决问题。然而,这种情况可能是数据库设计不佳的一个很好的指标,但是为了提出一个不同的解决方案,应该知道更广泛的数据库环境,即您正试图实现。对我来说,这似乎是VanInfo应该只是每个表的一个单独的实体(是的,完全重复,如Com_VanInfoSup_VanInfo等),除非VanInfo之间没有共享实体(然后关系应该倒置,即ComSupUtil应该包含VanInfo的FK。