如何使用未知属性建模数据?

时间:2011-01-27 23:37:53

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

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

例如......说我想模拟有关世界各国的信息。每个国家/地区都有人口标记语言列表,这很容易。但是说我们也想模拟他们的国家棒球队的赢/输记录,当然并非所有国家都有。或者,我们想要跟踪他们的国王和他们的血统。女王(再次,显然不适用于大多数国家)。或者,我们决定要模拟平均氏族成员在一生中竖立的蒙古包的数量

无论如何,重点是,我们不会(并且永远不会)知道在它袭击我们之前会发生什么。哪些方法既可扩展又可查询?

这可能是一个很好用于以文档为中心的数据库(MongoDB?),或者某些设计模式是否可以应用于经典的 Relational 数据库? / p>

4 个答案:

答案 0 :(得分:7)

您可以在纯关系数据库中执行此操作,并享受关系数据库的速度和功能。

你需要使用第六范式,正确的方法,完整的完整性和控制。

EAV是6NF的子集,没有完整性或控制权,通常执行得非常糟糕。

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

如果你正在使用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