【发布时间】:2012-03-08 19:20:06
【问题描述】:
假设我们有一个数据库,其中有一个表,该表是销售记录。您同时销售产品和服务,因此您也有一个产品和服务表。
每次销售都可以是产品或服务,因此设计数据库的选项如下:
为每种类型添加列,即。将 Service_id 和 Product_id 添加到 Invoice_Row,这两个列都可以为空。如果它们都为空,则这是与任何事物无关的临时收费,但如果满足其中之一,则它是与该类型相关的一行。
添加一个奇怪的基于字符串/id 的系统,例如:Type_table、Type_id。这将分别是字符串/varchar 和整数,前者将包含例如“服务”,而后者将包含服务表中的 id。这显然是松散耦合和可怕的,但只要您只从代码中访问数据库,这是一种解决方法。
使用新表抽象出“可收费的东西”的概念,其中 Product 和 Service 现在是其中的抽象,并且在 Invoice_Row 表上,您可以链接到 ChargeableEntity_id 之类的东西。然而,这里的 ChargeableEntity 表本质上是多余的,因为它也需要某种方式来链接到抽象的“后端”表,这让我们一直回到同样的问题。
您会选择哪种方式,或者解决此问题的其他替代方法是什么?
【问题讨论】:
-
如果您想根据销售类型(产品或服务)存储不同的销售详细信息,这可能会变得复杂。
-
@ypercube 是的,这基本上是我的选项#1,但我不确定这是否是正确的方法。就像你说的那样它可能会变得复杂,如果添加不同的类型(除了产品/服务,是的,我知道它很少见)怎么办?
-
嗯,不,我的意思是链接另一个问题。在此处查看 gbn 的答案(选项 3):NULLs in a composite primary key - SQL Server。那些宠物/猫/狗是您的 ChargableEntity/产品/服务
-
如果添加了不同的类型,则添加另一个(子类型)表。
标签: sql-server database database-design relational-database