lit*_*ris 6 sql sql-server database-design
我必须在现有应用程序中添加功能,并且我遇到了数据情况,我不确定如何建模.我被限制为创建新的表和代码.如果我需要改变现有的结构,我认为我的客户可能会拒绝该提案.虽然如果它是唯一能够做到正确的方法,那么我将不得不这样做.
我有一个Item表,可以链接到任意数量的表,这些表可能会随着时间的推移而增加.Item只能链接到另一个表,但另一个表中的记录可能有很多项链接到它.
表/实体的例子被链接到是Person
,Vehicle
,Building
,Office
.这些都是单独的表.
物品的实例是Pen
,Stapler
,Cushion
,Tyre
,A4 Paper
,Plastic Bag
,Poster
,Decoration"
例如,a Poster
可以分配给a Person
或Office
or Building
.将来如果他们添加一个Conference Room
表,它也可能会被添加到表中.
我的初步想法是:
Item
{
ID,
Name
}
LinkedItem
{
ItemID,
LinkedToTableName,
LinkedToID
}
Run Code Online (Sandbox Code Playgroud)
LinkedToTableName
然后,该字段将允许我在我的代码中标识要链接到的正确表.
我对这个解决方案并不是很满意,但我不能想到其他任何事情.请帮忙!:)
谢谢!
Aar*_*ght 12
将表名存储为列值不是一个好习惯.这是一个糟糕的黑客.
做你想做的事有两种标准方法.第一种称为单表继承.ORM工具很容易理解这一点,但会进行一些规范化.这个想法是,所有这些实体 - Person
,Vehicle
无论如何 - 都存储在同一个表中,通常每个条目有几个未使用的列,以及一个标识符字段,用于标识实体的类型.
discriminator字段通常是整数类型,映射到代码中的某个枚举.它也可能是数据库中某些查找表的外键,用于标识哪些数字对应于哪些类型(不是表名,只是描述).
另一种方法是使用多表继承,这对您的数据库更好,但不容易在代码中映射.你可以通过一个基表来定义所有对象的一些常见属性 - 可能只是一个ID和一个名称 - 并且所有"特定"表(Person
等)都使用基本ID作为唯一的外键(通常也是主键).
在第一种情况下,排他性是隐含的,因为所有实体都在一个表中.在第二种情况下,关系Item
在基本实体ID之间,这也保证了唯一性.
请注意,对于多表继承,您有一个不同的问题 - 您不能保证只有一个继承表使用基本ID.它可以被几个使用,或根本不使用.这就是为什么多表继承方案通常也有一个鉴别器列,以识别哪个表是"预期的".同样,该鉴别器不具有表名,它保持查找值,消费者可以(或可能不)使用该查找值来确定要加入哪个其他表.
多表继承与您当前的模式更接近,因此我建议使用它,除非您需要将其与Linq to SQL或类似的ORM一起使用.
请参阅此处以获取详细的详细教程:在SQL Server中实现表继承.
Dam*_*vic 10
找到人,车辆,建筑,办公室常见的东西.由于缺乏更好的术语,我使用了Entity.然后实现Entity及其子类型之间的超类型/子类型关系.请注意,所有子类型表中都是EntityID
a PK
和a FK
.现在,您可以将Item表链接到Entity(所有者).在此模型中,一个项目只能属于一个实体 ; 一个实体可以拥有(拥有)许多项目.
归档时间: |
|
查看次数: |
4332 次 |
最近记录: |