数据库/实体设计:与多个表中的任何一个相关的表
-
03-07-2019 - |
题
A 报告 可以有多个图表。这 图表 表如下所示:
- 图表 -- ID, 图表ID, 报告编号, ...
这 图表ID 上面可以映射到 图表ID 到任一 一 以下图表类型:
- 线: 图表ID, 厚度, Y轴, X轴, 颜色, ...
- 馅饼: 图表ID, 半径, 颜色, ...
- 酒吧: 图表ID, 宽度, 颜色, 边界, ...
我正在使用 SQL Server,不幸的是使用 CouchDB 等替代解决方案不是可行的选择。我还打算使用实体框架将这些表映射到实体。
这个设计是我的第一次尝试,我发现这个设计存在多个问题:
- 图表.报告编号 不能是多个表上的外键,因此强制执行 FK 是一个问题。
- 运行 SQL(或 Linq)查询时,我必须运行两个查询来获取图表类型,然后查询该表。或者,我必须运行 加入 对照所有表格来获取图表数据。
- 当对图表类型进行连接时, 图表ID 这些表之间必须是唯一的,所以 图表.图表ID 仅映射到其中之一 线.图表ID 或者 酒吧.图表ID 或者 馅饼.图表ID.
- 使用 EF 来映射它会很棘手。
我想这是一个很常见的问题,有规定的解决方案和既定的方法来处理它。
我的设计道路正确吗?如果是这样,如何克服上述问题(FK、联接、跨多个表的唯一 id 和映射)。
解决方案
这 回答 关于策略相当全面。SQL 团队的文章 在SQL Server中实现表继承 带我去我想去的地方。
解决方案
您是否考虑过将图表放在同一个表中并使用 每个层次结构继承的表 图案?那里的链接显示了如何在实体框架中实现这一点。它是否可行取决于所有这些图表类型的不同程度以及每种图表类型需要多少个字段。
还有 每种类型的表 继承与您已经描述的更相似。
其他提示
我会用表继承方案来解决这个问题:
Chart (ChartId, ChartTypeId)
PK (ChartId, ChartTypeId)
CHECK ChartTypeId IN ('Line', 'Bar', 'Pie')
LineChart (ChartId, ChartTypeId)
PK (ChartId, ChartTypeId)
FK (ChartId, ChartTypeId) -> Chart
CHECK ChartTypeId IN ('Line')
要添加图表,首先添加到“基本”图表表,然后添加到相应的“子类型”图表表。检查约束使一切保持一致。
折线图。饼图和条形图是图表的特殊形式。
查找“泛化专业化关系建模”以获得有关此模式的好文章。
或者,我必须在所有表上运行一个加入才能获取图表数据。
是的,那很好。
不隶属于 StackOverflow