【问题标题】:Polymorphism in databases数据库中的多态性
【发布时间】:2016-11-15 10:41:16
【问题描述】:

我想为一组玩家建模一个数据库实体。 每个玩家都应该有:

  • 许多固定字段(名称、角色...)
  • 技能等级的多个可变字段(如果角色是 ATK,技能应该是 stat1 和 stat2;如果角色是 DEF,技能应该是 stat3 和 stat4)。

实现这种实体的最佳方式是什么(关系数据库和非关系数据库都适合我)?

最简单的解决方案当然是为每个角色保存不同的表。我还找到了this 答案,这很好,但已经 7 岁了,可能已经过时了。其他想法?


这是一个示例数据集:

"name": "name1"
"role": "attack"
"strength": 10
"constitution": 5

"name": "name2"
"role": "attack"
"strength": 7
"constitution": 7

"name": "name3"
"role": "defense"
"health": 8
"resistence": 8

"name": "name4"
"role": "defense"
"health": 10
"resistence": 10

"name": "name5"
"role": "support"
"mana": 4
"willpower": 3

【问题讨论】:

  • 多态是一种面向对象的设计概念,而不是数据库概念。通常,为了弥合数据库和应用程序之间的差距,并使前者看起来面向对象,使用诸如 Hibernate 之类的工具。你能给我们展示一下样本数据吗?
  • 我添加了一个简单的数据集!
  • 在我看来,您可以使用单个用户表,如果需要规范化数据库,还可以使用其他一些属性表。

标签: sql oop orm polymorphism nosql


【解决方案1】:

数据的 OO 结构

您已在Character 群体中确定了几个派生自抽象角色的类,即AttackDefenseSupport。每种角色都有不同的属性,具体取决于类别。

因此,您显然有一个 OOP 设计,并希望在数据库中实现它。可以使用几种设计模式:

  • 最简单的方法似乎是single table inheritance 将所有字段放在一个表中。这些是根据具体角色使用/解释的。
  • class table inheritance 将与每个角色(以及角色本身)相关的数据放在不同的表中。这需要派生类的表(例如Defense)和父类表(此处为Character)之间的 1:1 关系。这似乎有点矫枉过正
  • concrete table inheritance 将父类与派生最多的类合并,因此您最终会为每个角色创建一个表,每个角色都有自己的 name 字段。同样,这在这里似乎有点过头了。

类或关系?

您可以考虑另一种附加模型。它是一个类似于设计的组件,基于组合(在关系的 SQL 模式中):

  • 您将拥有一张character 表,其中包含idnamerole
  • 您将拥有一个包含角色idproperty-id(或名称)和value 的属性表。

如果您想非常灵活和富有创造力并发明其他属性(例如“拥有武器 A”、“拥有武器 B”、“装甲强度”等),建议您这样做。但是,如果您打算相对紧密地坚持当前的属性,这将又是矫枉过正。

无 SQL

如果您想考虑一个非关系数据库,通常是No-SQL database,那么您可以考虑非常适合处理类似于单继承表的结构的基于文档的数据库。

如果您选择组件设计,那么键值存储也是一种选择,但您仍然需要组装这些部件。这就是额外灵活性的代价 ;-)

你说的是多态性?

多态性是与类相关的行为而不是描述对象的数据。由于这不是行为问题,我猜你的意思是处理不同类型的数据(所以更多的是关于类)。如果我在这一点上错了,请告诉我。

但是你应该让问题中的多态性,因为它可以帮助其他不太了解 OOP 术语的人找到类似问题的解决方案

【讨论】:

    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多