DB/实体设计:与多个表中的任一表相关的表

3
一份报告可以有多个图表,Chart表如下:
  • Chart -- Id, ChartId, ReportId, ...
上述的ChartId可映射到以下一种图表类型之一:
  • Line: ChartId, Thickness, YAxis, XAxis, Color, ...
  • Pie: ChartId, Radius, Color, ...
  • Bar: ChartId, Width, Color, Border, ...
我正在使用SQL Server,但不幸的是像使用CouchDB等其他解决方案并不可行。 我还打算使用Entity Framework将这些表映射到实体。
这个设计是我的第一次尝试,我发现它存在多个问题:
  1. Chart.ReportId不能是多个表上的外键,因此强制执行FK是一个问题。
  2. 运行SQL(或Linq)查询时,我将不得不运行两个查询以获取图表类型,然后查询该表。 或者,我将不得不对所有表运行join以获取图表数据。
  3. 当与Chart Types进行连接时,这些表中的ChartId需要是唯一的,因此Chart.ChartId仅映射到Line.ChartId Bar.ChartIdPie.ChartId之一。
  4. 使用EF将其映射可能有些棘手。
我想象这是一个足够常见的问题,有预定义的解决方案和已经建立的处理方式。
我的设计是否正确?如果正确,如何解决上述问题(FK,连接,多个表中的唯一id和映射)。

解决方案

这个答案非常详细地介绍了策略。 SQL Team的文章在SQL Server中实现表继承让我达到了目标。
4个回答

2

我建议使用表继承方案来解决这个问题:

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

要添加图表,首先需要向“基础”图表表中添加内容,然后再添加到相应的“子类型”图表表中。检查约束条件可以使所有内容保持一致。

2

您是否考虑将图表放在同一张表中,并使用表层次结构继承模式?该链接展示了如何在Entity Framework中实现此功能。它的可行性取决于这些图表类型有多不同以及每种类型需要多少个字段。

还有一种更类似于您已经描述的表类型继承。


1

折线图、饼图和柱状图是专门的图表形式。

查找“泛化特化关系建模”以获取有关此模式的良好文章。


0
或者,我必须对所有表执行联接以获取图表数据。
是的,那很好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接