一个报表可以有多个图表。图表表如下所示:
图表——id,chartid,reportid,…
上面的ChartID可以映射到以下任一图表类型的ChartID:
线:ChartId,厚度,Yxax,x轴,颜色,…
饼图:图表ID、半径、颜色…
条形图:图表ID、宽度、颜色、边框…
我使用的是sql server,不幸的是,使用couchdb等替代解决方案不是可行的选择。我还打算使用实体框架将这些表映射到实体。
这个设计是我的第一次尝试,我发现这个设计有很多问题:
chart.reportid不能是多个表上的外键,因此强制FK是一个问题。
当运行一个sql(或linq)查询时,我必须运行两个查询来获取图表类型,然后查询该表。或者,我必须对所有表运行连接才能获取图表数据。
对图表类型进行联接时,这些表中的chartid必须是唯一的,因此chart.chartid只能映射到line.chartid或bar.chartid或pie.chartid中的一个。
用ef映射这个将是很棘手的。
我想这是一个很常见的问题,有规定的解决方案和既定的方法来处理它。
我的设计是否正确?如果是,如何克服上述问题(fk、join、跨多个表的唯一id和映射)。
解决方案
这对策略来说是相当全面的。sql团队关于answer的文章让我如愿以偿。
最佳答案
你是否考虑过把图表放在同一张表中,并使用Table per heirarchy inheritance模式?这里的链接显示了如何在实体框架中实现这一点。它是否可行取决于所有这些图表类型的差异以及每个类型需要多少字段。
还有Table per type继承,它更类似于您已经描述的内容。