gpt4 book ai didi

sql - 数据库中的多态性

转载 作者:行者123 更新时间:2023-12-04 13:31:05 25 4
gpt4 key购买 nike

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

  • 一些固定字段(名称、角色、...)
  • 技能等级的多个可变字段(如果角色是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

    最佳答案

    您的数据的 OO 结构

    您已经在您的 Character 中确定了几个类。人口,来自抽象角色,即 Attack , DefenseSupport .每种角色根据类别具有不同的属性。

    因此,您的脑海中清楚地有一个 OOP 设计,并希望在数据库中实现它。可以使用几种设计模式:

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

  • 类或关系?

    您可以考虑另一种额外的模型。它是一个类似设计的组件,基于组合(在关系的 SQL 模式中):
  • 你会有一个 characterid 的 table , namerole
  • 您将拥有一个包含角色 id 的属性表。 , property-id (或姓名)和 value .

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

    无 SQL

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

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

    你说多态?

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

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

    关于sql - 数据库中的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40607731/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com