【问题标题】:Storing an object with unknown structure存储结构未知的对象
【发布时间】:2016-07-08 19:59:43
【问题描述】:

假设

  • 一个用户可以有多个字符
  • 角色属于用户
  • 角色具有基本属性 name、player、experience_points、status
  • 一个字符可以是许多不同的?类型之一? (工作名称)
    • 我说“be”是因为我不确定这是否是一个 has_a 关系,其中 Type 是一个属性
    • 示例类型为
      • D&D5e 与属性类、能力、法术
      • 具有自然、风度、意志力、世代、血统等属性的 WoDVampire。
      • WoDWerewolf 具有自然、风度、灵知、愤怒等属性。

(注意:上面的一些属性更好地反映为 E/R,但现在这不是重点。)

我不确定如何在 Character 和 Type 之间建模这个 E/R(我应该更改它的名称,因为已经有一个属性 :type。)

我考虑过单表继承,但发现它缺乏,因为看起来所有潜在类型之间的所有属性都将存储在同一个表中,这看起来非常……笨重。

【问题讨论】:

标签: ruby-on-rails database ruby-on-rails-4 store


【解决方案1】:

需要注意的一点是,不需要将所有数据都存储在数据库中。

如果相同类型的角色共享相同的能力集,这些能力和类型的数量是相当静态的(不要经常更改),您可以围绕一组包含所有必需的普通 ruby​​ 类来构建您的逻辑数据和访问方法。

另一方面,您可能希望让没有适当编程知识的人添加新类。在这种情况下,您可以将所有信息保存为文件系统上的本地文件,例如“wod_vampire.chr”。它的内容可以是包含属性及其值的键值对的散列,也可以是具有特定顺序的元素的数组。

好的,所以我们考虑了所有非数据库方式,但它们并不适合我们。假设您使用的是关系数据库,还有几个选项。

第一个是单表继承(您已经知道这种方式)。所有可能的属性都将存储在一个表中,但每个types 只知道其中一组特定的属性并与之交互。

第二种是使用一些现代数据库中实现的json数据类型(例如PostgresqlMysql)。这允许您存储散列而不限制其结构(换句话说,您可以根据需要拥有尽可能多的不同属性)。请注意,您可能需要实现自己的一组 getter/setter 方法来访问以这种方式存储的值。

【讨论】:

    猜你喜欢
    • 2014-10-10
    • 2010-10-01
    • 1970-01-01
    • 2019-12-19
    • 2015-07-18
    • 2015-03-10
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多