gpt4 book ai didi

sql-server - 关系数据库中的许多表到单行

转载 作者:搜寻专家 更新时间:2023-10-30 20:20:17 25 4
gpt4 key购买 nike

假设我们有一个数据库,其中有一个表,该表记录了一次销售。您同时销售产品和服务,因此您也有一个产品和服务表。

每次销售都可以是产品或服务,因此设计数据库的选项如下所示:

  1. 为每种类型添加列,即。将 Service_id 和 Product_id 添加到 Invoice_Row,这两个列都可以为空。如果它们都为 null,则这是与任何内容无关的临时费用,但如果满足其中一个,则它是与该类型相关的行。

  2. 添加一个奇怪的基于字符串/id 的系统,例如:Type_table、Type_id。这将分别是一个字符串/varchar 和整数,前者将包含例如“服务”,后者是服务表中的 id。这显然是松散耦合和可怕的,但只要您仅从代码访问数据库,这就是解决它的一种方法。

  3. 使用新表抽象出“收费的东西”的概念,Product 和 Service 现在是新表的抽象,在 Invoice_Row 表上您可以链接到 ChargeableEntity_id 之类的东西。但是,此处的 ChargeableEntity 表本质上是多余的,因为它也需要某种方式来链接到抽象的“后端”表,这让我们又回到了同一个问题。

您会选择哪种方式,或者解决此问题的其他替代方案是什么?

最佳答案

您实质上要问的是如何在关系数据库中实现多态性。这个问题有很多方法(正如你自己所展示的)。一种解决方案是使用“每个类一个表”继承。在此设置中,将有一个父表(类似于您的“收费项目”),其中包含唯一标识符以及产品和服务共有的字段。将有两个子表,products 和 goods:每个子表都包含该实体的唯一标识符和特定于它的字段。

与其他方法相比,这种方法的一个好处是您最终不会得到一个包含许多可空列的表,这些列实际上变成了描述任何内容的垃圾场(“无模式”)。

一个缺点是随着继承层次结构的增长,获取实体的所有数据所需的连接数量也会增加。

关于sql-server - 关系数据库中的许多表到单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9623508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com