我们有一个基本表,用于定义零件并保存零件号,描述,价格,重量等信息。我们还有大约400个表,这些表引用该基本表并根据零件的类型/类别提供有关零件的其他信息。
我们从使用外键约束开始,以便如果在400个特定于零件的表之一中引用了某个零件,则不能从基表中删除该零件,但是我们很快就达到了SQL Server 2005推荐的最大253个外键。
在这种情况下,是否可以使用外键替代方案来确保数据完整性?访问数据时我们还没有看到性能问题,但是由于查询计划太复杂,更新基表中的现有零件将失败。
我们有一个基本表,用于定义零件并保存零件号,描述,价格,重量等信息。我们还有大约400个表,这些表引用该基本表并根据零件的类型/类别提供有关零件的其他信息。
我们从使用外键约束开始,以便如果在400个特定于零件的表之一中引用了某个零件,则不能从基表中删除该零件,但是我们很快就达到了SQL Server 2005推荐的最大253个外键。
在这种情况下,是否可以使用外键替代方案来确保数据完整性?访问数据时我们还没有看到性能问题,但是由于查询计划太复杂,更新基表中的现有零件将失败。
Answers:
如果有任何方法可以将零件分组,则可以引入中间表作为解决方法。 这行不通。
Parts
+ Table 1
+ Table 2
+ ...
+ Table 400
但是遵循这些思路的事情可能会发生。
Parts
+ RedOrangeYellow parts
+ Table 1
+ Table 2
+ ...
+ Table 200
+ GreenBlueIndigoViolet parts
+ Table 201
+ Table 202
+ ...
+ Table 400
不过,在建议这样做之前,我想仔细看一下您的DDL 。而且,如果这样做,就不要开始到处乱扔ID号。您应该能够将“表400”直接连接到“零件”,而不必包括“ GreenBlueIndigoViolet零件”。
如果您确实无法合并表,为什么不在TRIGGER
基表上创建一个防止删除的表呢?
从这里开始:http : //msdn.microsoft.com/zh-cn/library/ms189799(v=sql.90).aspx
用一张替换400多个表。只需要3个字段(+1自动编号或任何主键,如果需要的话,不必拥有它就可以在其他字段中形成它)
物品ID属性值
因此,在其他表中每个字段代表一个属性的位置,在此表中,您的属性全部在一个字段中。你会有这样的事情
ItemID属性值
袜子材质羊毛
袜子颜色红色
袜子重量20磅
外星人星球阿尔法半人马座
外星人颜色紫色
外星人友善
ItemID可能应该是数字/字母数字ofc。然后,仅在必要时将带有Atrributes作为列标题的表进行交叉表生成,即可生成所需的表。这也可以更好地查询诸如“向我展示来自半人马座的所有物品”之类的东西,它可以带给您外星人以及陨石碎片,其中碎片中含有消灭人类的瘟疫(即将来临.....)
根据有多少记录,优化可能会很棘手,但这是设计此记录的更好方法。对于包含一堆几乎没有重叠的配方(10k +)的数据库,我也进行了相同的操作。在这种情况下效果很好。确实没有任何速度问题。您可能会更难,具体取决于您要处理的数量。
Entity
,Entity_Attribute
,Entity_Attribute_Value
)。如果要为不同的数据类型和引用约束添加半适当的处理,则需要更多。