2015-12-17 73 views
1

此刻,我的設計正在努力達到某個程度,並且我可能會讓它按照我擁有的方式正常工作,但是我對它感到不滿意,因爲我覺得它應該會更好。設計一個類似但不同的數據庫

本質上,我有一個系統,您可以創建文檔。通過這種方式,您可以選擇要創建的文檔類型並顯示錶單。然後將數據添加到表單中,並生成文檔。

我在Laravel工作,通過模型完成工作。我發現自己爲每個文檔創建了一個新模型,但我不認爲這是最好的方法。這是我的數據庫外觀的一個小例子 Design of database

所以它的核心是項目。我進入我的系統並創建一個新項目。通過一個項目,我現在可以爲這個項目創建文檔。所以說,我從一個選擇框中選擇項目簡介,形式顯示給我一息尚存,我可以輸入

  • 項目角色
  • 項目數據
  • 交付
  • 預算

從本質上講,其三個文本字段和一個標準輸入字段。如果我從選擇菜單中選擇報告文檔,則必須輸入此文檔的數據,這是一對常規輸入,幾個文本字段和一個日期。

因此,雖然它們都是文檔,但他們期望不同的數據,這就是爲什麼我爲每個文檔創建模型的原因。

這個問題存在於幾個方面。首先,如圖所示,我希望允許支持文檔與生成的文檔一起上傳。我有這個doc_upload表。所以一個文檔可以有一個或多個doc_uploads。

現在回到MVC結構,在我的DocUpload模型中,我不能說DocUpload屬於ProjectBriefDoc和ProjectReportingDoc,因爲它只能屬於一個Model。因此,我現在的設計方式是,我不僅要爲每個文檔創建一個新模型,還必須爲每個文檔創建一個新的上傳模型。

隨着更多的文件被添加,我可以看到這成爲一個噩夢來管理。

我覺得我所追求的是一個更通用的模型,它可以處理不同類型的文檔。我的奮鬥關係到我需要爲每個文檔捕獲的不同類型的數據,以及我如何能夠將其融入到我的設計中。

我知道我現在有一個可以工作的設計 - 但有些東西告訴我這是一個壞主意。真的,我只是在尋求建議,以便我可以更好地設計這一點,同時考慮到每個文檔需要不同的輸入,並且每個文檔都需要允許文件上傳。

非常感謝

回答

2

對於您要創建的每種文檔類型,您不需要有表格/型號。

更靈活的方法是有一個project_documents表,在這裏你將有一個PROJECT_ID和與之相關的一些數據,然後相關project_documents表doc_uploads。

通過這種方式,項目可以擁有您的業務所需的儘可能多的文檔,並且每個文檔可以擁有所需的儘可能多的文件。

你可以嘗試這樣的事情:

enter image description here

如果你仍想保留這兩個表,在你的例子你doc_upload表可以有兩個外鍵和兩個屬於關聯()Laravel型號的聲明沒有衝突(這不是婚姻,而是一種開放的關係)。

或者您可以使用Polymorphic Relations來做同樣的事情,但它是數據庫設計的反模式(因爲它不能確保數據庫級別的數據完整性)。

關於數據庫設計的一個很好的參考,谷歌爲「比爾卡爾文」和「SQL反模式」。

這個人有一個非常好的Slideshare presentation和一本關於這個主題的書 - 他曾經是一個積極的SO用戶。

+1

非常明確和可擴展 – DaveTheRave

1

好的。

我有一個建議..你不必在doc_upload引用上有如此緊密的耦合。您可以將其實際上視爲您的模型中的獨立表格,該表格不與一個實體掛鉤。你仍然可以使用ORM刪除你的方式和管理這張表..

我會做的就是保持doc_upload表,並將其用於所有文檔的所有up_load引用,而不管文檔所在的表模型以及有在doc_upload表中的以下字段

documenttype(其可以是對象名稱的目標文檔對象)

documentid_fk(這是現在的類屬鍵到單個行中的適當的文件類型表(一個或多個)

因此給定一個給定的表中的文檔..(你可以導出基於模型對象的文檔類型),並且您知道文檔本身的標識,因爲您只是從數據庫上下文中提取它。應該能夠拉取與這兩個值匹配的doc_upload表中的所有相關文檔。

你也許能夠在你的模型中使用反射來知道你在哪個實體(doc類型)中,而關鍵只是關鍵..所以你應該能夠。

你仍然必須創建你想擁有的項目文件的每種口味的新模式實體..但可能不會太困難,如果變化率小..

你應該能夠編寫最小數量的代碼以將所有相關的上傳文檔拖入您的應用程序中。

1

您可以在數據模型設計中使用通過零或一個關係繼承。
海事組織擁有一個名爲project-document的抽象實體(表格),它包含所有文件的共享屬性,將爲您服務。

project-briefproject-report和其他類型的文件將是project-document表的孩子,具有零或一的關係。主鍵project-document將是外鍵和子鍵的主鍵。
現在在project-documentdoc-upload之間具有一對多關係將解決該問題。
我還建議增加一個唯一約束{project_id, doc_type}項目文檔中的紅衣主教支票(如有必要)
enter image description here

相關問題