数据库结构指导和参考ID取决于另一列

时间:2019-05-02 21:34:10

标签: database-design architecture software-design

正在为我和我的朋友们的DnD游戏进行一个小的概念验证项目,并且不确定我如何组织数据库的方向是否是最好的方法。总体思路是为所有不同的游戏收集角色表的集合(不玩dnd游戏的玩家的所有属性)。问题是我们有几种不同类型的游戏。因此,我想到了两种方法来处理不同类型的字符表将具有不同字段的事实。

  1. 具有一个单个字符表,该表最终具有用于所有不同类型字符的大量列。 (不喜欢这种方法,因为它看起来很混乱)
  2. 具有一个角色表,该表具有诸如所有者,角色名称等基本信息,但也具有game_type_id和sheet_id。然后,针对每个包含实际角色数据的游戏,使用不同的表(最终将组成设备,法术等东西的表组,每个游戏都有自己的表)。因此,game_type_id将用于了解sheet_id所引用的表组

选项1似乎杂乱无章,添加了更多的游戏类型,但是选项2似乎最终会创建很多不同的表,因为添加了更多的游戏,因为每个工作表都有基本信息表,然后所有相关表事情有很多。

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

2 个答案:

答案 0 :(得分:1)

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

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');

答案 1 :(得分:0)

您应该将它们分开,例如,寻求解决方案2。

在现实世界中,每个玩家和每个游戏只有一张纸,因此这与该方法是一致的,另外的好处是您现在可以在一张桌子中拥有玩家的通用性,以及每款游戏的细节在每个游戏或每个工作表中。但是,这假定您具有关系数据库。

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