【问题标题】:How to model data with unknown attributes?如何对具有未知属性的数据进行建模?
【发布时间】:2011-06-16 22:22:42
【问题描述】:

对需要查询但无法预先完全定义的数据进行建模的好方法有哪些?

例如...假设我想对有关世界各国的信息进行建模。每个国家/地区都有人口国旗语言列表,这很简单。但是假设我们还想模拟他们国家棒球队的输赢记录,当然,并不是所有国家都有这样的记录。或者,我们想要追踪他们的国王和王后的血统(同样,显然不适用于大多数国家)。或者,我们决定要模拟普通部落成员一生中将竖起的蒙古包数量

无论如何,重点是,我们不(也永远不会)知道会发生什么,直到它击中我们。有哪些既可扩展又可查询的方法?

这对于以文档为中心的数据库(MongoDB?)是否有用,或者某些设计模式可以应用于经典的关系数据库?

【问题讨论】:

    标签: sql ruby-on-rails database-design nosql data-modeling


    【解决方案1】:

    您可以在纯关系数据库中做到这一点,并享受关系数据库的速度和强大功能。

    您需要使用第六范式,这是具有完全完整性和可控性的正确方法。

    EAV 是 6NF 的一个子集,没有 Integrity 或 control,通常实施得非常糟糕。

    我对这些问题的回答提供了对该主题的全面处理。由于所提出的上下文和论点,最后一个特别长。

    EAV-6NF Answer One
    EAV-6NF Answer Two
    EAV-6NF Answer Three

    【讨论】:

      【解决方案2】:

      所有数据库都应该能够随着时间的推移而发展。如果您有合适的人员和组织,那么在模型出现新属性时添加新属性应该没有问题。

      【讨论】:

        【解决方案3】:

        您可以申请Entity Atribute Value Model,但它是rails 中的PITA;我使用过 MongoDB,它非常适合您的需求。

        【讨论】:

          【解决方案4】:

          如果您使用的是 Rails,您可以在模型中使用 serialize :column_name,它会为您成功保存大多数对象,而无需任何额外工作。如果您认为不需要无模式 NoSQL 数据库,这可能是获得此功能的最简单方法。

          class Country << ActiveRecord::Base
            serialize :data
          
            def add_statistic(name, value)
              data[name] = value
            end
          
            def get_statistic(name)
              data[name]
            end
          end
          

          那些方法有些多余;他们在那里只是为了给你一个例子。

          此类系统的最大缺点是您是否需要根据这些内容进行搜索或查询。毕竟,Rails 不会为您处理Country.find_by_win_loss_record_of_national_basketball_team

          【讨论】:

            猜你喜欢
            • 2014-03-18
            • 2012-07-21
            • 2014-11-27
            • 2018-04-16
            • 2018-10-10
            • 2014-09-03
            • 2013-12-23
            • 2019-11-08
            • 1970-01-01
            相关资源
            最近更新 更多