Database design 数据库结构方向和引用ID根据另一列引用不同的表

Database design 数据库结构方向和引用ID根据另一列引用不同的表,database-design,architecture,software-design,Database Design,Architecture,Software Design,正在为我和我的朋友进行一个小型的概念验证项目DnD游戏,不确定我如何组织数据库的方向是否是最好的方法。总的想法是为所有不同的游戏制作一个角色表集合(我们为那些不玩dnd的玩家提供的所有统计数据)。问题是我们有几种不同类型的游戏。所以我想到了两种方法来处理不同类型的字符表将有不同的字段这一事实 有一个单一的字符表,它最终为所有不同类型的字符提供了大量的列。(不喜欢这种方法,因为它看起来很杂乱) 有一个角色表,该表包含基本信息,如所有者、角色名称等,但也有一个游戏类型id和工作表id。然后为每一个包

正在为我和我的朋友进行一个小型的概念验证项目DnD游戏,不确定我如何组织数据库的方向是否是最好的方法。总的想法是为所有不同的游戏制作一个角色表集合(我们为那些不玩dnd的玩家提供的所有统计数据)。问题是我们有几种不同类型的游戏。所以我想到了两种方法来处理不同类型的字符表将有不同的字段这一事实

  • 有一个单一的字符表,它最终为所有不同类型的字符提供了大量的列。(不喜欢这种方法,因为它看起来很杂乱)
  • 有一个角色表,该表包含基本信息,如所有者、角色名称等,但也有一个游戏类型id和工作表id。然后为每一个包含实际角色数据的游戏创建不同的表(最终将是设备、咒语等的表组,每个游戏都有自己的表)。因此,game_type_id将用于知道sheet_id引用的是哪一组表
  • 添加更多游戏类型时,选项1似乎没有组织,但随着添加更多游戏,选项2似乎最终会创建许多不同的表,因为每个表都有基本信息表,然后所有相关表都有多个


    所以我的问题是,最好的方法是什么,这样所有不同类型的游戏表都可以保存在角色表中,即使它们需要不同的字段?

    我相信你是说一个角色可以有许多角色表(对应于不同的游戏类型)角色的属性会因游戏类型而异。拥有一个包含所有属性的宽表将给您带来未来的痛苦,因为需要添加、删除属性等,因此我建议采用以下结构:

    Character
    CharacterId
    CharacterName
    Gender
    -- other fields common to all characters
    
    GanmeType
    GameTypeId
    GameTypeName
    --other relevant fields
    
    GameTypeAttributes
    GameTypeAttributesId
    GameTypeid
    AttributeName
    
    CharacterSheet
    CharacterSheetId
    CharacterId
    GameTypeAttributesId
    AttributeValueInt
    AttributeValueVARCHAR
    -- column for every data type you would use
    
    例如,下面的代码将创建一个名为Arya的角色,该角色与游戏“大战”关联

    在大型战争游戏中,角色必须具备力量、耐力和魅力

    然后我们为这些属性设置Arya的值

    INSERT INTO Character VALUES (1,'Arya','F');
    INSERT INTO GameType VALUES (1,'Big War');
    INSERT INTO GameTypeAttributes VALUES (1,1,'Strength'),(2,1,'Stamina'),(3,1,'Charisma');
    INSERT INTO CharacterSheet VALUES (1,1,1,10,NULL),(2,1,2,4,NULL),(3,1,3,NULL,'None whatsoever');
    
    如果愿意,我们可以将Arya添加到另一个游戏中:

    INSERT INTO GameType VALUES (2,'Fuzzy Duck');
    INSERT INTO GameTypeAttributes VALUES (4,2,'Stomach Strength'),(5,2,'Fearlessness'),(6,2,'Bravery');
    INSERT INTO CharacterSheet VALUES (4,1,4,10,NULL),(5,1,5,4,NULL),(6,1,6,NULL,'Enourmous amounts');
    

    您应该将它们分开,即采用第2种解决方案

    在现实世界中,每个玩家和游戏都有一张牌,因此这将与该方法保持一致,还有一个额外的好处,即您现在在一张表中拥有玩家的共性,以及在每场游戏或每张牌表中每个游戏的细节。但是,这假设您有一个关系数据库


    也许您更喜欢像MongoDB(面向文档)或Neo4j(面向图形)这样的NoSQL数据库,它允许您以不同的方式表示数据。它可以使您更轻松地建模和维护信息。但即使在这种情况下,您也需要在概念上将玩家与游戏分开。

    因此,您有一个角色表,根据与之关联的游戏类型,它本质上为玩家保留不同的属性?一个玩家将有>1个角色表(对于不同的游戏类型?)正确,因此,不确定是制作一个包含大量字段的单字符表更好,还是将其分离出来更好,只需一个字符表,并有许多字段来包含不同游戏的不同属性?为什么要为每个属性制作一行,而不是一行作为字符和字符使列具有不同的属性,使用您的方法,值列不能是不同的变量类型,如布尔型、整数型等。我对数据库设计不太在行,因此可能会遗漏一些内容。我已更新了答案,以说明数据类型很重要这一事实。由于上一个答案未完全规范化,因此需要进行其他编辑