【问题标题】:Which one is correct and optimized in sql?在sql中哪一个是正确和优化的?
【发布时间】:2014-04-27 04:36:09
【问题描述】:

假设我有三个实体(EntityAEntityBEntityC)可以有一些images。所以有两种方法:

  1. 为每个实体创建一个image 表。这意味着EntityA 有一个名为AImagesimage 表,EntityBEntityC 也是如此。 这种方法更智能,但表格更多。

  2. 有一个 image 表和另一个表名 EntityType

EntityType 表有一个EntityTypeId 列和一个name 并有三个记录:1,EntityA2,EntityB3,EntityC

然后在image 表中:

如果我为EntityA 保存记录,image 表中的记录将是:1,1,name

第一列是ImageId,第二列是EntityTypeId,第三列是image's filename

如果我为EntityB 保存记录,image 表中的记录将是:2,2,name

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

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

哪一个是优化的还是其他方式...

【问题讨论】:

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


    【解决方案1】:

    有一个图像表和另一个表名EntityType。

    这将要求您手动实施参照完整性,即trickier than it looks

    所以要么:

    • 对于每个 1:N 关系,为每个“1”表(如您所建议的那样)有一个单独的“N”表,
    • 或使用 exclusive FK or inheritance 之类的东西,如果您想避免过多的结构重复。

    【讨论】:

      【解决方案2】:

      正确的方法是将图像存储在各自表中的varbinary(max) 列中,而不是将它们分开。 SQL Server 会以一种有效的、行外的方式对它们进行物理存储。

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

      【讨论】:

      • 我正在开发一个 Web 应用程序。将文件保存在数据库中是否优化?那么空间管理或服务器资源管理或查询大小呢?并且每条实体记录可以有任意数量的图像。
      • 如果是 1:m 关系,则走单独的表格路线(一张图片表格一张普通表格)。无论如何都要考虑文件流(在功能文档的答案中有一个链接)。
      【解决方案3】:

      似乎有一个包含其他实体共享属性的BaseEntity 表会对您有所帮助。
      EntityA & EntityB & EntityC 将是 BaseEntity 的孩子,它们的主键将是 EntityBase 表的主键。
      它们之间的关系可以是零或一。
      建议在 BaseEntity 中使用一个名为 entyty_type 的鉴别器列。

      图片和地址等其他集合将连接到此EntityBase 表。

      【讨论】:

        猜你喜欢
        • 2016-05-18
        • 1970-01-01
        • 2016-05-31
        • 1970-01-01
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-10
        相关资源
        最近更新 更多