【问题标题】:Does SQL Server have native support for EAVSQL Server 是否具有对 EAV 的本机支持
【发布时间】:2011-03-31 11:51:25
【问题描述】:

我喜欢 CouchDB 和 MongoDB 的灵活模式功能,但我也喜欢 SQL Server 的关系“连接”功能。我真正想要的是能够拥有基本上是“开放模式”的表,例如 PERSON、COMPANY 和 ORDER,其中每个表都有一个 ID,但其余列定义为 json 样式{ID:12,firstname:"Pete",surname:"smith",height:"180"},但我可以直接或通过多对多外部参照表有效地将 PERSON 加入公司。有谁知道 SQL Server 是否有计划在 SQL 中合并“开放模式”,或者 Mongo 或 Couch 是否有计划支持有效加入?非常感谢。

【问题讨论】:

标签: sql-server mongodb couchdb database-schema schema-design


【解决方案1】:

CouchDB 提供了多种方法来建立各种文档/实体之间的关系。查看 wiki 上的 this article 以开始使用。

当您来自关系背景时,倾向于在尝试解决问题时继续使用相同的术语和思维方式。了解 NoSQL 解决方案非常不同非常重要,否则它们没有真正的存在目的。您应该真正寻求了解这些不同的 NoSQL 解决方案是如何工作的,这样您就可以将它们与您的应用程序的要求进行比较,看看它是否合适。

【讨论】:

    【解决方案2】:

    MongoDB = NoSQL = 无连接 - 永远不会。

    如果您因数据模型或项目要求而需要 JOIN:请继续使用 RDBMS。

    MongoDB 中的替代方案:

    • 非规范化

    • 使用嵌入文档

    • 多个查询

    【讨论】:

    • 那么,如果我需要联接,但我还需要一个灵活的主表架构,你会建议我做什么?
    • 您没有阅读我的回答,也没有反映您使用 MongoDB 的选择。
    【解决方案3】:

    尽管这对于大规模查询来说效率很低,但从技术角度来看,使用 XML 数据类型将允许您存储您想要的任何结构,并且可以随行变化。

    【讨论】:

      【解决方案4】:

      我不知道,但扮演自己的 EAV 并不难,毕竟只有 3 张桌子 :)

      • 实体存储关联的表名。
      • 属性存储列名、数据类型以及是否可以为空。
      • 值包含每个所需数据类型的一个可为空的列。

      实体 1..* 属性 1..* 值

      假设您使用 .NET,定义您的 EAV 接口,创建一些 POCO,然后让实体框架或您选择的 ORM 为您连接关联。 LINQ 非常适合这种操作。

      它还允许您创建混合模型,其中部分架构是已知的,但您仍然希望自定义数据具有灵活性。如果您在设计域模型时考虑到这一点(即在模型中使用 EAV 接口),则可以将 EAV 烘焙到 EF 数据上下文(或其他)中,以自动加载每个实体的属性及其值。您的 EF 实体只需要知道它属于哪个表实体。

      当然,这不是完美的解决方案,因为您(可能)为了灵活性而交易性能。根据您要保留的数据量和性能要求,它可能更适合大多数架构已知且较小百分比未知的模型。 YMMV。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 2012-05-18
        相关资源
        最近更新 更多