Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 菱形关系表(Linq到SQL)的最佳实践和/或建议_Sql Server_Linq_Sql Server 2005_Linq To Sql - Fatal编程技术网

Sql server 菱形关系表(Linq到SQL)的最佳实践和/或建议

Sql server 菱形关系表(Linq到SQL)的最佳实践和/或建议,sql-server,linq,sql-server-2005,linq-to-sql,Sql Server,Linq,Sql Server 2005,Linq To Sql,为了便于报告,我必须将4个表的内容从旧数据库导入SQL2005 产品包含id和产品名称,产品属性包含每个产品的可变数量的属性,成分包含每个产品的可变数量的成分,IngreditProperties包含与产品相同的属性,为每种成分指定 在当前设计中,我用黑色标记了表之间的关系,用红色和绿色标记了IngredientProperties表的可能外键 目前,我正在从给定的IdProduct的IngredientProperties中检索所有行,并从中生成报告,但我希望使用外键以允许将来更新数据 为了

为了便于报告,我必须将4个表的内容从旧数据库导入SQL2005

产品包含id和产品名称,产品属性包含每个产品的可变数量的属性,成分包含每个产品的可变数量的成分,IngreditProperties包含与产品相同的属性,为每种成分指定

在当前设计中,我用黑色标记了表之间的关系,用红色和绿色标记了IngredientProperties表的可能外键

目前,我正在从给定的IdProductIngredientProperties中检索所有行,并从中生成报告,但我希望使用外键以允许将来更新数据

为了更好地使用Linq,IngreditProperties表的关系的建议设计是什么

两份样本报告:

// 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

红色箭头表示产品不能在IngredientProperties中有任何行,除非该产品在ProductProperties中至少有一个匹配行。在产品有密度之前,产品的成分不能有密度,这有意义吗?仅“黑色箭头”FKs不存在此限制

(重复每种产品的属性是否有意义?成分A1的密度、不透明度或价格是否因其加入的产品而异?)

从IngCreditProperties到Components的FK是有意义的,但它应该是单个聚合键,而不是两个单独的FK,这意味着Components上的PK也应该是聚合键,这同样适用于ProductProperties

编辑:

谢谢你的更新。正如我前面所暗示的,添加外键以匹配图表中的红色/绿色箭头将在数据库中创建当前不存在的约束,这反过来可能会破坏使用数据库的现有代码(例如,在插入成分之前插入ProductProperties)

通过使用聚合键,基本上就是说配料表中只能存在一个(ProdID、IngredientID)。看起来这项工作已经完成了。如果带圆圈的标题项表示索引,则数据已被很好地索引

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

我仍然不能100%确定你在寻找什么,但以下是我的建议:

  • 在每个表上设置(或保留)PKs/索引,如用圆圈表示的标题项所示
  • 设置FKs以匹配配料和PropductProperties中的黑色箭头
  • 设置FKs以匹配绿色箭头
  • 索引是表之间高效连接查询所需的全部内容。外键用于维护“引用完整性”。例如,它们阻止您插入不存在的成分的属性


    您也可以做一些事情来规范化此数据库,但除非您有需要修复的特定问题,否则我不会更改它。

    看起来您的
    IngreditProperties
    表中有一个实体属性值设计。如果您在创建约束时没有极其细致,那么这些类型的设计可能会非常危险。根据目前为止您对手头问题的了解,您可以自由更改模式,并且没有指定需要支持任意属性

    如果属性列表确实是预定义的,并且很少会更改,我会将它们转换为列,对于这样的模式,在样式上有一些自由:

    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
    );
    

    当然,这并不能直接回答你的问题。相反,它让问题消失了。如果上面列出的假设是正确的,那么这应该能满足您的需求,并且工作起来更愉快。

    您的关系图没有通过…:(该链接不起作用,它将我重定向到某个110mb.com网站,该网站抱怨没有index.html设置,因此无法显示图像文件。该链接在家庭和工作中都有效:(我已经更新了图像链接。感谢您让我知道。IngredientProperties是故意非规范化的吗?您想考虑规范化所有内容以确保数据完整性吗?源数据库没有索引或外键。箭头基于表中通过视觉比较匹配的数据。没有文档数据库设计上的错误,没有供应商支持。表之间也没有关系,至少没有定义为外键。所有箭头都基于表中的匹配数据。-黑色箭头是目前唯一使用的,由我定义。-每个产品可以有不同的属性和不同的成分。E每个成分都必须具有每个产品属性。遗憾的是,成分属性随时间而变化,因此对于两种产品,同一成分的同一属性可能具有不同的值,如密度。我可以在ProductProperties和IngCreditEntProperties(红色箭头)之间使用聚合键(IdProduct+PropertyKey),删除产品和IngredientProperties之间的IdProduct关系(黑色箭头),并在IngredientProperties和配料之间使用聚合键(IdProduct+IDigredient)(绿色箭头),但我对此有一种奇怪的感觉。这些桌子与图片中显示的完全一样,但如果它能带来更多好处,我会非常高兴改变设计