数据库设计 - 对象继承

时间:2017-05-13 18:59:51

标签: mysql inheritance database-design

我正在考虑设计数据库的方法,但我想做得对,我认为这包括:

  • 数据库设计不应有任何冗余
  • 设计本身应该设定可能和不可能的限制
  • 数据库设计不需要任何业务逻辑来实现对象的持久性

这就是我现在所处的位置: 我的脑中有一个设计,并希望将其传输到mysql(任何其他DBMS都没问题,但我不认为这是问题)。 之后我想在数据库架构之上构建一个java应用程序。

我的问题似乎相当简单(为简单起见我删除了很多东西):

我有两个不同的对象/表:

  1. 船舶
    • ID
    • 名称
    • 速度
  2. 武器
    • ID
    • 名称
    • 损伤
  3. 我想要做的就是构建类似技术树的东西:

    • 如果你想建造Ship" Y"那么你必须研究Ship" X"第一。
    • 如果你想使用Weapon" B"那么你必须研究武器" A"第一
    • 如果你想使用Weapon" C"那么你必须研究武器" A"第一

    这很容易,但现在到了下一个限制:

    • 如果你想建造Ship" Z"那么你必须研究Ship" Y"和武器" B"和"武器" C"第一

    以下是树的直观表示:

    Tree

    为了代表树,我只提出了一个解决方案:

    创建一个名为" entity"的新表。与田地" id"和" table_name&#34 ;;还创建一个m2m表,其中包含两个字段" id_entity"和" id_entity_prequisite&#34 ;;桌子"船舶"和#34;武器"没有真正的主键" id"不再使用,而是使用表格中的外键" entities-> id"

    • good:可以表示完整的树
    • 坏&丑陋:我需要businesslogic来创建一个实体,使用id然后可以创建一个新的船或武器

    有没有其他(更好的,THE)方法呢?

2 个答案:

答案 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)

解决方案的选择取决于不同的因素,阅读有关数据库建模的任何好书可以帮助您做出决定,但在这样的情况下,我更倾向于第一个解决方案。