我正在开发一个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。
将这些表分开是最佳做法吗?这两种结构的其他含义是什么?
答案 0 :(得分:1)
此讨论仅涉及数据建模,而不涉及EF或ASP.NET MVC注意事项。我看到2个选项。两者都是正确的。选项1要求费用PK为FeeID,而CompanyID_FK不为空,而另外2 FK应为可空。
如果你想让你的模型变得灵活,我建议你选择2。
但是,如果您不打算扩展模型或者在此区域中没有其他要求,则选项1是有效选择,它使用较少数量的表并且将需要较少的代码行。
选项1的问题在于,如果您将来创建一个与费用表相关的表格,您将进入奇怪的情况,例如:
一个。如果您需要“费用描述”表,则必须有1张桌子才能支付所有3种费用。这并不好,因为某些描述可能不适用于所有费用类型。
B中。如果您需要再次使用“费用审批人”表,则必须有1个表,用于所有3种费用类型的审批人。
您不会遇到选项2的上述问题。
选项2的明显问题是额外的表数和额外的代码行。
虽然您没有提供尺寸信息,但我认为尺寸不会导致基于域性质的性能问题。