2017-05-13 197 views
0

我想到了一个办法,设计我的数据库,但我想这样做是正确的,这在我看来包括:数据库设计 - 对象继承

  • 数据库设计不应该有任何裁员
  • 的设计本身应该设置的限制什么是可能的,什么是不
  • 数据库设计应该不需要任何业务逻辑实现对象的持久性

这是我现在: 我有一个设计在我的大脑,并希望运输到MySQL(任何其他DBMS将罚款,但我不认为这是问题)。 之后我想在数据库体系结构之上构建一个Java应用程序。

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

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

  1. 船舶
    • ID
    • 速度
  2. 武器
    • ID
    • 损害

什么我想要做的是建立像一个高科技的树:

  • ,如果你想为了建造船舶“Y”,那么你必须首先研究船舶“X”。
  • 如果你想使用武器“B”,那么你必须先研究武器“A”。
  • 如果你想使用武器“C”,那么你必须首先研究武器“A”。

这将是很容易的,但现在到下一个限制:

  • 如果你想建立船舶“Z”,那么你必须要调查船“Y”和武器“B”和“武器“C” 第一

这里是树的可视化表示:

Tree

要表示一棵树,我想出了解决方法只有一个:

创建一个名为“实体”与领域“ID”和“表格名”新表;还要创建一个有两个字段“id_entity”和“id_entity_prequisite”的m2m表;表中“船”和“武器”没有一个真正的主键“身份证”了,而是使用一个外键表“实体 - > ID”

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

还有没有其他的(更好的是,THE)的方式来做到这一点?

回答

0

我不认为你在这里有一个数据库设计问题,你有一个应用程序设计问题。

你所描述的形式,逻辑“我只能做X,如果我符合下列条件......”就像你需要一个状态机的声音对我来说,和状态机的数据要求将司机在数据库模式之后。

在状态机上有相当多的教育资源,我会寻找一些Java = oriented的东西。

这里有一个有趣的观点:http://www.skorks.com/2011/09/why-developers-never-use-state-machines/

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) 

解决方案的选择取决于不同的因素,阅读数据库建模任何好的书可以帮助你决定,但在等的情况下这一个我更喜欢第一个解决方案。

+0

也许我不太了解你,但我认为你给我的第一个解决方案就是我在问题结束时提出的确切的事情。所以我认为这个问题并没有解决,因为要使这个解决方案起作用,应用层必须首先在Table“Entities”中创建一个条目,并使用该ID在Tabe“Ships”或“Weapons”中创建一个新条目。 - 我认为这是糟糕的设计。目前这是我做这件事的方式,因为我没有一个聪明的选择。解决方案2可能有效,但正如你所说,这不是首选。特别是如果2表格有更多的列? –