当一个表需要太多的外键时,有什么选择呢?


8

我们有一个基本表,用于定义零件并保存零件号,描述,价格,重量等信息。我们还有大约400个表,这些表引用该基本表并根据零件的类型/类别提供有关零件的其他信息。

我们从使用外键约束开始,以便如果在400个特定于零件的表之一中引用了某个零件,则不能从基表中删除该零件,但是我们很快就达到了SQL Server 2005推荐的最大253个外键。

在这种情况下,是否可以使用外键替代方案来确保数据完整性?访问数据时我们还没有看到性能问题,但是由于查询计划太复杂,更新基表中的现有零件将失败。


14
您真的认为您需要400个零件专用表吗?这些表中的每一个真的有什么不同?我认为您正在尝试修复此设计的错误部分。
亚伦·伯特兰

2
您在该数据库中大约处理多少行?
乔恩·塞格尔

4
我必须同意Aaron Bertrand的观点,如果您的设计要求您最大限度地利用sql server支持的外键,那么可能是时候考虑重新设计了。
DForck42

5
我在这方面做了很多设计-价格,产品管理,产品规格。即使在高度归一化的设计中,我也从来没有接近同一张桌子上的那么多FK。您是否正在执行某种数据分区策略(按客户端或时间或类似方法),导致您朝这个方向进行设计?没有有关您的设计和设计目标的更多信息,很难提供答案。
卡伦·洛佩兹

4
您能为其中的5个表格提供模式示例吗?
Damir Sudarevic

Answers:


6

如果有任何方法可以将零件分组,则可以引入中间表作为解决方法。 行不通。

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零件”。



-4

用一张替换400多个表。只需要3个字段(+1自动编号或任何主键,如果需要的话,不必拥有它就可以在其他字段中形成它)

物品ID属性值

因此,在其他表中每个字段代表一个属性的位置,在此表中,您的属性全部在一个字段中。你会有这样的事情

ItemID属性值

袜子材质羊毛

袜子颜色红色

袜子重量20磅

外星人星球阿尔法半人马座

外星人颜色紫色

外星人友善

ItemID可能应该是数字/字母数字ofc。然后,仅在必要时将带有Atrributes作为列标题的表进行交叉表生成,即可生成所需的表。这也可以更好地查询诸如“向我展示来自半人马座的所有物品”之类的东西,它可以带给您外星人以及陨石碎片,其中碎片中含有消灭人类的瘟疫(即将来临.....)

根据有多少记录,优化可能会很棘手,但这是设计此记录的更好方法。对于包含一堆几乎没有重叠的配方(10k +)的数据库,我也进行了相同的操作。在这种情况下效果很好。确实没有任何速度问题。您可能会更难,具体取决于您要处理的数量。


4
这被称为实体属性值模型,由于许多原因,这通常是一个非常糟糕的主意。对于“ alpha centauri”场景的示例,您可能正在查看两次表扫描,并且无法使用索引。而且,它使数据类型的任何优势失效,使关系约束不可能实现,并且通常无法在任何程度上优化或扩展。如果您需要存储一百多个左右的行,则不需要。
JNK 2013年

2
正如@JNK所指出的,这通常不是一个好的解决方案。而且,当您仅使用一张桌子时,情况就更糟了。我想说的最小值为3个表(EntityEntity_AttributeEntity_Attribute_Value)。如果要为不同的数据类型和引用约束添加半适当的处理,则需要更多。
ypercubeᵀᴹ

1
尽管由于其系统中实体的复杂性,OP可能会在传统规范化设计中接近某种限制,但大多数极其复杂的系统在EAV中并没有得到更好的处理,因为它提供了较弱的类型支持和应用程序级别参照完整性,因为所有数据都是相当通用地存储的。EAV有其有用的位置,但是我不准备推荐它作为当前说明的针对此问题的答案。
Cade Roux

呵呵,每天学习新东西。我是自学成才的,这很奇怪,我想出了解决我遇到的食谱问题的方法,这听起来像是这个家伙的问题。呃,好吧。感谢您提供的信息,我将研究EAV,也许还有一种更干净的方法也可以解决我的问题。因为所有值都是相同的数据类型,所以它对我来说可能更容易工作。我不知道。
user2125055

2
@ user2125055没问题,也不要亲自接受任何批评。我们只是拒绝使用EAV的想法!肯定有使用案例是有意义的,但是由于缺点,您需要非常小心。
JNK 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.