我正在考虑设计数据库的方法,但我想做得对,我认为这包括:
这就是我现在所处的位置: 我的脑中有一个设计,并希望将其传输到mysql(任何其他DBMS都没问题,但我不认为这是问题)。 之后我想在数据库架构之上构建一个java应用程序。
我的问题似乎相当简单(为简单起见我删除了很多东西):
我有两个不同的对象/表:
我想要做的就是构建类似技术树的东西:
这很容易,但现在到了下一个限制:
以下是树的直观表示:
为了代表树,我只提出了一个解决方案:
创建一个名为" entity"的新表。与田地" id"和" table_name&#34 ;;还创建一个m2m表,其中包含两个字段" id_entity"和" id_entity_prequisite&#34 ;;桌子"船舶"和#34;武器"没有真正的主键" id"不再使用,而是使用表格中的外键" entities-> id"
有没有其他(更好的,THE)方法呢?
答案 0 :(得分:0)
我不认为你有数据库设计问题,你有应用程序设计问题。
你描述的逻辑,形式"如果我满足以下条件,我只能做X ..."听起来像你需要一台状态机,状态机的数据要求将成为数据库模式背后的驱动因素。
状态机上有很多教育资源,我会寻找面向Java的东西。
这是一个有趣的观点:http://www.skorks.com/2011/09/why-developers-never-use-state-machines/
答案 1 :(得分:0)
您的问题是在关系数据库中建模继承的经典问题,它通常以两种不同的方式解决。第一个是通过以下表格:
Entities
- id (primary key)
- name
Ships
- id (primary key) (foreign key for Entities)
- speed
Weapons
- id (primary key) (foreign key for Entities)
- damage
Prerequisites
- id1 (foreign key for Entities)
- id2 (foreign key for Entities)
(both id1 and id2 forming the primary key)
如果您有其他常用属性以及“船只和武器”的特定属性,则此功能非常有用。
第二个是通过使用两个表:
Entities
- id (primary key)
- name
- kind (ship or weapon)
- speed (possibly null)
- damage (possibly null)
Prerequisites
- id1 (foreign key for Entities)
- id2 (foreign key for Entities)
(both id1 and id2 forming the primary key)
解决方案的选择取决于不同的因素,阅读有关数据库建模的任何好书可以帮助您做出决定,但在这样的情况下,我更倾向于第一个解决方案。