DB / Entity Design:与多个表中的任何一个表相关的表

时间:2009-04-29 19:31:18

标签: database entity-framework database-design orm domain-driven-design

报告可以有多个图表。 图表表格如下所示:

  • 图表 - ID ChartId ReportId ,...

上面的 ChartId 可以将 ChartId 映射到以下图表类型的一个

  • ChartId 厚度 YAxis XAxis 颜色,...
  • Pie ChartId Radius Color ,...
  • ChartId 宽度颜色边框,..

我正在使用SQL Server,不幸的是,使用CouchDB等替代解决方案并不是可行的选择。我还打算使用Entity Framework将这些表映射到实体。

这个设计是我的第一次尝试,我发现这个设计存在多个问题:

  1. 图表 ReportId 不能是多个表上的外键,因此强制执行FK是个问题。
  2. 运行SQL(或Linq)查询时,我必须运行两个查询来获取图表类型,然后查询该表。或者,我必须对所有表格运行加入以获取图表数据。
  3. 对图表类型进行连接时,这些表格中的 ChartId 必须是唯一的,因此图表 ChartId 只映射到一个 ChartId ChartId Pie ChartId
  4. 使用EF进行映射将非常棘手。
  5. 我认为这是一个普遍存在的问题,有规定的解决方案和已建立的方法来处理它。

    我是否在设计的正确道路上?如果是这样,如何克服上述问题(FK,连接,跨多个表的唯一ID和映射)。

    解决方案

    这个answer对策略非常全面。 SQL Team关于implementing table inheritance in SQL Server的文章让我得到了我想要的地方。

4 个答案:

答案 0 :(得分:2)

您是否考虑过将图表放在同一个表格中并使用Table per heirarchy inheritance模式?其中的链接显示了如何在Entity Framework中实现它。它是否可行取决于所有这些图表类型的差异以及每个图表需要多少字段。

还有Table per type继承,它与您已经描述的更为相似。

答案 1 :(得分: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 :(得分:1)

折线图。饼图和条形图是图表的专用形式。

查找关于此模式的好文章的“泛化专业化关系建模”。

答案 3 :(得分:0)

  

或者,我将不得不进行联接   获取图表数据的所有表格。

是的,没关系。