2009-04-29 44 views
0

我必须从旧数据库中将4个表的内容导入到SQL 2005中,以便于报告。钻石关系表的最佳实践和/或建议(Linq to SQL)

产品包含ID和产品名称,ProductProperties含有可变数量的每个产品的特性,成分含有可变数量的成分为每个产品的,并IngredientProperties包含相同属性的产品,为每种成分指定。

alt text http://www.freeimagehosting.net/uploads/15068ece48.png

用黑色标志着我在目前的设计表之间的关系,并用红色和绿色的IngredientProperties表可能的外键。

目前,我从IngredientProperties检索所有行对于给定IdProduct和生成的报告,但我想用外键,以允许数据的未来更新。

什么是IngredientProperties表的关系的建议设计,以更好地与Linq一起使用?

两个样本报告:

// IdProduct = 1 

     Price Density 
A1 25  10 
A2 56  14 

// IdProduct = 2 

     Price Density Opacity 
B1 87  21   60 
B2 50  31   70 
B3 12  10   90 
+0

你的关系图不是通过... :( – 2009-07-12 13:54:13

+0

该链接不工作,它将我重定向到一些110mb.com网站,抱怨没有index.html设置,因此不显示图像文件。 – Lima 2009-07-13 07:57:25

+0

It在家中和工作中工作:(我已经更新了图像链接,谢谢你让我知道它 – alexandrul 2009-07-13 09:56:39

回答

1

你的红色箭头暗示产品不能有任何行中IngredientProperties除非该产品在ProductProperties至少有一个匹配行。在产品具有密度之前,产品的成分是否具有密度是否有意义?只有“黑色箭头”FK才存在此限制。

(是否甚至是有意义的重复特性对每个产品?是否成分A1的密度,不透明度或价格取决于哪个产品它并入?)

的FK从IngredientProperties成分是有道理的,但它应该是一个单一的聚合密钥,而不是两个单独的FK,这意味着成分上的PK也应该是一个聚合密钥,同样适用于ProductProperties

编辑:

感谢您的更新。如前所述,添加外键以匹配图表中的红色/绿色箭头会在数据库中创建当前不存在的约束,这反过来又会破坏使用数据库的现有代码(如果它插入到ProductProperties在插入配料之前,请使用

通过使用聚合键,你基本上是说,只有一个(PRODIDIngredientID)可在成分表中。看起来这已经完成了。如果圈出的标题项表示索引,则数据已经被良好地编入索引。

我怀疑“顶部”红色箭头实际上是不正确的。有两个PropertyKey行,但我不认为它们表示相同的事情,因为每个表中都有一个单独的PropertyValue。一对代表产品的性质,成分的其他性质,因此将它们连接在一起只会造成混淆。

我仍然不是100%肯定,你在找什么,但这里是我的建议:

  1. 设置(或保留)的圆圈头几项表示每个表的PK /索引。
  2. 设置FK以匹配Ingredients中的黑色箭头和PropductProperties
  3. 设置FK以匹配绿色箭头。

索引是表之间高效连接查询所需的索引。外键用于维护“参照完整性”。例如,它们阻止您为不存在的成分插入属性。

有几件事情你可以做的规范化这个数据库以及,但我不会改变它,除非你有特定的问题,需要修复。

1

看起来您的IngredientProperties表中有一个实体属性值设计。如果您在创建约束条件时不谨慎,那么这些设计可能会非常危险。从目前为止所讲述的问题来看,您可以自由更改模式,并且您没有指定需要支持任意属性。

如果属性列表,着实预定义和很少会发生变化,我将他们变成列,对于一个模式,它会是这个样子,采取了一些自由搭配风格:

CREATE TABLE Ingredients(
    ProductID int IDENTITY NOT NULL PRIMARY KEY, 
    SerialNum varchar(15) NOT NULL UNIQUE, 
    Opacity int, 
    Density int 
); 

CREATE TABLE Ingredients(
    IngredientID int IDENTITY NOT NULL PRIMARY KEY, 
    ProductID int NOT NULL FOREIGN KEY REFERENCES Products (ProductID), 
    SerialNum varchar(15) NOT NULL UNIQUE, 
    Price money NOT NULL, 
    Opacity int, 
    Density int 
); 

这当然不会直接回答你的问题。相反,它会使问题消失。如果上面列出的假设是正确的,这应该满足您的需求,并且更合作愉快。