我试图弄清楚如何为 RPG 数据库布局表格,其中角色种族、阶级和神灵等信息对允许的组合有限制。
例如:
Race
-----------
id | name
1 | Human
2 | Elf
3 | Dwarf
Class
-----------
id | name
1 | Warrior
2 | Wizard
3 | Thief
Deity
-----------
id | name
1 | GodA
2 | GodB
3 | GodC
我想限制某些组合,例如只有人类和精灵可以成为巫师,只有人类和矮人可以成为战士,但三者都可以成为盗贼。但我也想将神祇限制在某些种族/职业组合中。例如,人类只能崇拜GodA或GodB,而不能崇拜GodC;选择成为小偷意味着你不能崇拜 GodB,所以你最终只能选择 GodA,等等。
可以使用哪种模式来映射此信息,这种类型的关系数据是否有名称,以及检索最终映射的查询是什么样的?
对于您要实现的目标没有特定的模式名称,但有两种方法可以实现它,具体取决于您最终使用的数据库管理系统。
您可以为每个值组合创建一个链接表。每个合法组合都将获得它自己的行,并且具有
id
它链接在一起的每个基表的外键字段。这通常称为维度组合表。您也可以考虑使用一个更加非规范化的表来存储所选的每个实例,其中每个基表的
character
外键引用字段,以及可以在每个字段中输入哪些值组合的复合约束。(这种复杂约束功能的可用性将取决于您使用的数据库系统。)id
这是一个相当标准的建模练习,您所做的只是布置将为每个角色提供有效选择的关系(并作为好处填充前端的下拉菜单)。
根据您的描述,我们有以下依赖项:
因此,我们将需要三个实体
RaceClass
、RaceDeity
和ClassDeity
。主键将是每个父实体的主键的组合。该
Character
实体将与这三个实体具有 FK 关系,以确保 、 和 的Race
值Class
有效Deity
。图表形式:
几点注意事项:
对于具有有限数量值的表(通常具有常见/易于理解的缩写),使用短字符值作为主键而不是自动递增整数是有意义的。这为我们提供了一些优势:
(1, 'Jim the Somewhat Strong','HUM','WAR','GODA')
与(1, 'Jim the Somewhat Strong', 2, 3, 1)
.1
可能意味着 Thief 或 Elf 或 GodB,对于人类可读的代码,换位是不可能/非常不可能的。