2017-04-20 228 views
-1

我有以下情況: 有實體'Master_Entity'。該實體具有屬性如名稱,類型,持續時間等。還有其他兩種類型的實體「實體」和「子實體」。與「Master_Entity」有相同之處(它們具有完全相同的屬性)。數據庫設計解決方案

最後,'Master_Entity'應該包含'實體'的集合,'實體'應該包含'子實體'的集合。棘手的部分是'實體'類型的記錄可以是不同的'Master_Entity'的一部分(對於'子實體'是相同的),但是它們可以具有不同的持續時間值。如何才能實現這種模塊化?

在這裏,我想出了,但它不是做的工作。願你們幫我解決這個問題。

enter image description here

編輯:想象一下,這是某種工作跟蹤器。例如,你有一個'創建PHP應用程序'(主實體)。該實體包含完成此項工作需要多長時間。此外,它還包含一個實體「編寫代碼」(實體),這個實體可以分爲'編寫Http客戶'(子實體),該實體具有特定於此作業的持續時間屬性。

另一方面,你可能有其他的工作:'創建一個Java應用程序'(主實體),它將包含相同的'寫代碼'實體,但持續時間將有不同的價值,因爲應用程序的上下文你正在建設。

我想要一個單獨的記錄'編寫代碼',但是它擁有的持續時間值應該與分配給它的每個作業不同。如何通過創建'Entity'類型的最小重複記錄來實現這一點?

+2

你是什麼意思與「*,但它不是做的工作*」?你的問題到底是什麼? –

+0

也許一些樣本數據和預期結果會幫助我理解您的問題。並停止使用那個可怕的ID作爲標識符名稱,我不能告訴你用什麼作爲圖中的連接pk/FK關係。 Id作爲名稱是非常糟糕的SQL反模式。 – HLGEM

+1

只要每個FK都是TargetTableNameID,@HLGEM ID就是PK的一個很好的列名稱。 –

回答

0

聽起來像這3個表會爲你工作:

Entity 
* Id 
* Name 
* Type 

EntityGroup 
* Id 
* Name 
* ParentEntityGroupId 
* ParentEntityId  

EntityRelationship 
* Id 
* EntityId 
* ParentEntityId 
* EntityGroupId 

通過這樣的結構,你可以有一個實體是一個組的成員,或其他實體的獨奏兒童。你也可以讓一個組成爲一個實體的孩子,或者甚至是另一個組的孩子。在不知道數據的具體情況的情況下,很難知道您可能需要什麼,但這應該讓您開始。

+0

謝謝!將嘗試這種方法 –

0

從你所說的話看來,你根本不需要EAV,因爲你對每個項目沒有不同的屬性只是不同的值。因此你不應該使用它。

您需要的是查找表格和表格的組合,這些表格解決了作品的實際跟蹤歷史記錄。 這是因爲這是時間敏感數據。創建項目時的任務可能與兩年後與該任務組關聯的任務大不相同,但您需要在創建時記錄任務)。請注意,這不是反規範化,它是及時創建數據的圖片。真正的持續時間永遠都是這個項目從來沒有去過的任務。在任務中,你可以有一個建議的持續時間作爲起點。我使用了類似的設計(當然有更多的領域)來設計一個數據庫,用於構建技術硬件相關項目的銷售建議。這裏真正的關鍵是要識別哪些數據需要存儲爲點時間以及用於構建最終項目數據的查找數據。如果有人向「創建Java應用程序」組添加新任務,則不需要更改已完成或正在工作的項目的詳細信息,而僅更改新項目。

因此,你需要:

Task group 
    Task Group ID 
    Task Group Name 

Task 
    TaskID 
    Task Name 
    SuggestedDuration (can be null if you have tasks that are always different 
        but filled in for tasks that usually have a similar duration) 

Task_Taskgroup 
    TaskID 
    TaskGroupID 

Project 
    ProjectID 
    ProjectName 
    TaskGroupID 

ProjectTask (should be filled in automatically when the task group is 
      chosen for the project) 
    ProjectID 
    Task ID 
    EstimatedDuration (fills in the default value, but can be changed 
         by the person creating the work project) 
    ActualDuration (Field in after the task is done, can be used by an 
        analyst to create more reflective task default duration values) 

當然每個表中可能根據需要等領域。