繁体   English   中英

数据库中的多态性

[英]Polymorphism in databases

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

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

实现这样一个实体的最佳方式是什么(关系数据库和非关系数据库对我来说都没问题)?

最简单的解决方案当然是为每个角色保留一个不同的表。 我也找到了这个答案,这很好但是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

数据的OO结构

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

因此,您清楚地了解了OOP设计,并希望在数据库中实现它。 可以使用几种设计模式:

  • 最简单的似乎是单表继承将所有字段放在一个表中。 根据具体角色使用/解释这些。
  • 类表继承将与每个角色(以及字符本身)相关的数据放在不同的表中。 这需要派生类'表(例如, Defense )和父类表(此处为Character )之间的1:1关系。 这似乎有点矫枉过正
  • 具体的表继承将父类与最派生的类合并,因此每个角色最终会有一个表,每个表都有自己的name字段。 再次,这似乎有点矫枉过正。

课程或关系?

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

  • 你会有一个带有idnamerole character
  • 你将拥有一个属性表,其中包含字符的idproperty-id (或名称)和value

如果你想要非常灵活和富有创造力并且发明其他属性(例如“有武器A”,“有武器B”,“装甲强度”等),可以建议这样做。 但是,如果你打算坚持相对于当前的属性,这将再次过度杀伤。

无SQL

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

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

你说多态?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM