2017-05-13 440 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表格有更多的列? –