gpt4 book ai didi

sql - 如何在 SQL Server 中建立互斥关系模型

转载 作者:行者123 更新时间:2023-12-02 17:07:16 25 4
gpt4 key购买 nike

我必须向现有应用程序添加功能,但我遇到了不确定如何建模的数据情况。我仅限于创建新表和代码。如果我需要改变现有的结构,我认为我的客户可能会拒绝该提案......尽管如果这是正确解决问题的唯一方法,这就是我必须做的。

我有一个项目表,可以链接到任意数量的表,并且这些表可能会随着时间的推移而增加。该项目只能链接到另一个表,但另一个表中的记录可能有很多项目链接到它。

链接到的表/实体的示例有PersonVehicleBuildingOffice。这些都是单独的表。

项目示例有订书机坐垫轮胎A4纸塑料袋海报装饰”

例如,海报可以分配给办公室建筑物。将来,如果他们添加 session 室 table ,也可能会添加到其中。

我的初步想法是:

Item
{
ID,
Name
}

LinkedItem
{
ItemID,
LinkedToTableName,
LinkedToID
}

LinkedToTableName 字段将允许我识别要在代码中链接到的正确表。

我对这个解决方案不太满意,但我想不出其他的办法。请帮忙! :)

谢谢!

最佳答案

将表名存储为列值并不是一个好的做法。这是一个糟糕的黑客行为。

有两种标准方法可以完成您想要做的事情。第一个称为单表继承。 ORM 工具很容易理解这一点,但会牺牲一些规范化。这个想法是,所有这些实体 - PersonVehicle 等等 - 都存储在同一个表中,通常每个条目有几个未使用的列,以及一个 discriminator 字段,用于标识实体的类型。

鉴别器字段通常是整数类型,映射到代码中的某些枚举。它也可能是数据库中某些查找表的外键,用于标识哪些数字对应于哪些类型(不是表名称,只是描述)。

实现此目的的另一种方法是多表继承,这对您的数据库更好,但在代码中映射起来不太容易。您可以通过使用一个基表来实现此目的,该表定义了所有对象的一些通用属性(可能只是一个 ID 和名称)以及所有“特定”表(Person等)使用基本 ID 作为唯一外键(通常也是主键)。

在第一种情况下,排他性是隐式的,因为所有实体都在一个表中。在第二种情况下,关系是在 Itembase 实体 ID 之间,这也保证了唯一性。

请注意,对于多表继承,您会遇到不同的问题 - 您无法保证基本 ID 恰好由一个继承表使用。它可以被几个人使用,或者根本不使用。这就是为什么多表继承方案通常还有一个鉴别器列,以识别哪个表是“预期的”。同样,这个鉴别器不保存表名,它保存一个查找值,消费者可以(或不可以)使用该值来确定要连接到哪个其他表。

多表继承与您当前的架构更匹配,因此我建议您使用它,除非您需要将其与 Linq to SQL 或类似的 ORM 结合使用。

请参阅此处以获得详细的教程:Implementing Table Inheritance in SQL Server .

关于sql - 如何在 SQL Server 中建立互斥关系模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2704655/

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