哪一个在sql中是正确的和优化的?

时间:2014-04-27 04:36:09

标签: sql sql-server database-design relational-database query-optimization

想象一下,我有三个实体(EntityAEntityBEntityC)可以有一些images。所以有两种方式:

  1. 为每个实体制作一个image表。这意味着EntityA有一个名为image的{​​{1}}表,AImagesEntityB的表格类似。 这种方法更智能,但有更多的表格。

  2. 有一个EntityC表和另一个表名image介于两者之间。

  3. EntityType表格有EntityType列和EntityTypeId,并有三条记录:name1,EntityA2,EntityB

    然后在3,EntityC表中:

    如果我保存image的记录,EntityA表中的记录就是:image

    第一列是1,1,name,第二列是ImageId,第三列是EntityTypeId

    如果我保存image's filename的记录,EntityB表中的记录就是:image

    如果我保存2,2,name的记录EntityA表中的记录就是:image

    在此方法中,表的数量会减少,但查询会更长。

    哪一个是优化的或任何其他方式...

3 个答案:

答案 0 :(得分:1)

  

有一个图像表和另一个表名为EntityType的文件。

这将要求您手动强制执行参照完整性,即trickier than it looks

所以:

  • 对于每个1:N的关系,有一个单独的" N"表格为每个" 1"表(如您所建议的),
  • 如果您想避免过多的结构重复,请使用exclusive FK or inheritance之类的内容。

答案 1 :(得分:0)

最简单的方法是将图像存储在各自表格的varbinary(max)列中,而不是将它们分开。 SQL Server将以高效的行外方式处理它们。

根据使用的SQL Server版本和LOB的大小,您可以考虑FILESTREAMFILETABLE feature

答案 2 :(得分:0)

似乎有一个BaseEntity表,其中包含其他实体的共享属性,对您有所帮助 实体A&实体B& EntityC将是BaseEntity的childes,它们的主键将是EntityBase表的主键。
它们之间的零或一关系将起作用。
将推荐在BaseEntity中使用名为entyty_type的鉴别器列。

其他集合(如图像和地址等)将连接到此EntityBaseenter image description here