具有相同模式的多个表或具有多个外键的1个表?

时间:2014-01-29 19:39:52

标签: database entity-framework database-design

我正在开发一个ASP.NET MVC 4应用程序,在每个“级别”都有一个添加费用的选项。假设我有一个可以有很多广告系列(1对多)的公司,以及有很多产品(1对多)的广告系列。 [使用DB首次设计]

公司,活动和产品都可以列出与其相关的“费用”,费用数据相同[名称,价值,FK等]

我目前正在使用“CompanyFee”,“CampaignFee”和“ProductFee”表,它具有与其关联的表的外键。 [除FK关系以外的相同表格]

只有一个“费用”表,每个表都有一个可以收费的外键列是否有意义。所以“FeeTable”将是[name,value,CompanyID(FK),CampaignID(FK),ProductID(FK)等]

如果ProductID是唯一带有值的FK,则意味着它将被视为“ProductFee”,而其他则为null。

将这些表分开是最佳做法吗?这两种结构的其他含义是什么?

1 个答案:

答案 0 :(得分:1)

此讨论仅涉及数据建模,而不涉及EF或ASP.NET MVC注意事项。我看到2个选项。两者都是正确的。选项1要求费用PK为FeeID,而CompanyID_FK不为空,而另外2 FK应为可空。

如果你想让你的模型变得灵活,我建议你选择2。

但是,如果您不打算扩展模型或者在此区域中没有其他要求,则选项1是有效选择,它使用较少数量的表并且将需要较少的代码行。

选项1的问题在于,如果您将来创建一个与费用表相关的表格,您将进入奇怪的情况,例如:

一个。如果您需要“费用描述”表,则必须有1张桌子才能支付所有3种费用。这并不好,因为某些描述可能不适用于所有费用类型。

B中。如果您需要再次使用“费用审批人”表,则必须有1个表,用于所有3种费用类型的审批人。

您不会遇到选项2的上述问题。

选项2的明显问题是额外的表数和额外的代码行。

虽然您没有提供尺寸信息,但我认为尺寸不会导致基于域性质的性能问题。

enter image description here