数据库结构方向和参考 ID 引用不同的 table,具体取决于另一列
Database Structure Direction and Have a reference ID refer to a different table depending on another column
正在为我和我的朋友 DnD 游戏做一个小型的概念验证项目,不确定我关于如何组织数据库的指导是否是最好的方法。总的想法是为所有不同的游戏收集角色 sheets(我们玩家的所有统计数据,供那些不玩 dnd 的玩家使用)。问题是我们有几种不同类型的游戏。所以我想到了两种方法来处理不同类型的字符 sheet 会有不同的字段。
- 只有一个字符 table,最终会为所有不同类型的字符提供大量的列。 (不喜欢这种方法,因为它看起来很混乱)
- 有一个角色 table,其中包含所有者、角色名称等基本信息,还有一个 game_type_id 和 sheet_id。然后对包含实际字符数据。因此 game_type_id 将用于了解 sheet_id 引用的 table 集合
添加的游戏类型越多,选项 1 似乎越乱,但选项 2 似乎最终会创建很多不同的 table,因为添加的游戏越多,每个 sheet 都会具有基本信息 table,然后是所有相关的 table 事物的倍数。
所以我的问题是什么是最好的方法,这样所有不同类型的游戏 sheet 都可以保留在角色 table 中,即使它们需要不同的字段?
我相信你是说一个角色可以有很多角色表(对应不同的游戏类型),并且角色的属性因游戏类型而异。具有所有属性的宽 table 会给你带来未来的痛苦,因为需要添加、删除属性等,所以我建议采用以下结构:
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 的角色,该角色与游戏 "Big War"
在大型 War 游戏中,角色必须具有力量、耐力和魅力属性。
然后我们为这些属性设置 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。
在现实世界中,每个玩家和游戏会有一个 sheet,因此这将与该方法一致,还有一个额外的好处,即您现在拥有一个玩家的共性 table,以及每场比赛或每场比赛的细节 sheet tables。但是,这假设您有一个关系数据库。
也许您更喜欢像 MongoDB(面向文档)或 Neo4j(面向图形)这样的 NoSQL 数据库,它允许您以不同的方式表示数据。它可以让您更轻松地建模和维护信息。但即使在这种情况下,您也需要在概念上将玩家与游戏分开。
正在为我和我的朋友 DnD 游戏做一个小型的概念验证项目,不确定我关于如何组织数据库的指导是否是最好的方法。总的想法是为所有不同的游戏收集角色 sheets(我们玩家的所有统计数据,供那些不玩 dnd 的玩家使用)。问题是我们有几种不同类型的游戏。所以我想到了两种方法来处理不同类型的字符 sheet 会有不同的字段。
- 只有一个字符 table,最终会为所有不同类型的字符提供大量的列。 (不喜欢这种方法,因为它看起来很混乱)
- 有一个角色 table,其中包含所有者、角色名称等基本信息,还有一个 game_type_id 和 sheet_id。然后对包含实际字符数据。因此 game_type_id 将用于了解 sheet_id 引用的 table 集合
添加的游戏类型越多,选项 1 似乎越乱,但选项 2 似乎最终会创建很多不同的 table,因为添加的游戏越多,每个 sheet 都会具有基本信息 table,然后是所有相关的 table 事物的倍数。
所以我的问题是什么是最好的方法,这样所有不同类型的游戏 sheet 都可以保留在角色 table 中,即使它们需要不同的字段?
我相信你是说一个角色可以有很多角色表(对应不同的游戏类型),并且角色的属性因游戏类型而异。具有所有属性的宽 table 会给你带来未来的痛苦,因为需要添加、删除属性等,所以我建议采用以下结构:
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 的角色,该角色与游戏 "Big War"
在大型 War 游戏中,角色必须具有力量、耐力和魅力属性。
然后我们为这些属性设置 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。
在现实世界中,每个玩家和游戏会有一个 sheet,因此这将与该方法一致,还有一个额外的好处,即您现在拥有一个玩家的共性 table,以及每场比赛或每场比赛的细节 sheet tables。但是,这假设您有一个关系数据库。
也许您更喜欢像 MongoDB(面向文档)或 Neo4j(面向图形)这样的 NoSQL 数据库,它允许您以不同的方式表示数据。它可以让您更轻松地建模和维护信息。但即使在这种情况下,您也需要在概念上将玩家与游戏分开。