2009-06-17 146 views
2

我最近對數據建模進行了一些閱讀,並對實體可能扮演的角色提出了疑問。實體關係建模:如何實現實體「角色」?

考慮一個簡單的情況下,你已經有了一個公司,並且公司可以是供應商,客戶,分銷商等,或這些角色的組合。所以X公司可能既是供應商又是客戶。

下在數據層面,你可能對公司的再表對供應商,客戶等引用該公司表的表。至少我認爲這是如何表示的。

好了,最多的地方在申請土地,你已經有了類客戶和供應商等。每個人都會由一個公司組成,然後對這個特定的班級做任何其他特殊的事情。

這就是全部確定,對我來說很有意義,只要我們只用一個實體類在同一時間工作。如果我們想從一家公司開始,看看它在扮演什麼角色呢?所以在一個應用程序中,我可能會拉起一個公司,看看它是一個供應商還是一個分銷商。

現在有幾種不同的方式我能想到的要做到這一點,但我覺得,因爲這個問題域太舊,必須有用於建模這些概念的一些嘗試和真正的模式。

因此,我在這裏搜索的是用於在應用程序級建模實體角色的常用策略或模式。關於這個特定主題的具體參考材料將不勝感激(無論是博客或書籍或其他)。

回答

0

我害怕,我不能給「常見模式」如何處理這個問題。但我也認爲,根本不存在「唯一」的模式。

原因是,建模是某種「模糊」。我記得德國電腦雜誌中的一些非常相似的造型問題。這是一種比賽,他們展示了他們獲得的不同解決方案。解決方案完全不同,但所有這些解決方案都是有效的。我認爲這也取決於手頭問題的細節。有時,一個「瘦」的解決方案是美麗的......在其他情況下,「大,脂肪,盛大的」解決方案必須要做,以滿足項目的需求...

比如,造型依舊是許多創造性的任務自由參數。

當然,有一些「元模式」,這是「商定的」。例如在着名的「四人幫」 "Design patterns"和其他許多可用的書中。但仍然存在很多問題,沒有達成一致的「最佳」解決方案。

就你而言,可以使用子分類(這相當於專業化)。也可以將「供應商」等作爲一個可能/可能不被公司支持的接口(這可以被視爲來自抽象實體的可選專業化)。但也可以使用合成物來解決同樣的問題。角色可以是由公司鏈接的對象(實體)(例如,具有關係「has-role」)。

+0

我在這裏談論更多關於「面向對象的建模」,而不是關於「ER建模」。我希望它仍能提供一些見解,因爲對我而言,它們之間並沒有太大的區別。 – Juergen 2009-06-17 22:18:19

1

我會推薦使用繼承作爲最後的手段。像這樣的關係不是直截了當的,而且很容易通過早期優化的形式弄壞設計。 當公司既可以是供應商也可以是分銷商時,您不希望創建具有供應商或分銷商屬性的公司。相反,想想它會像正常化數據庫一樣。你有一組概念如下

  • 公司(CompanyID,名稱,attrib1,attrib2)
  • 供應商這是公司(供應商ID,CompanyID [外鍵],attrib1,attrib2)
  • 經銷商(DistributorID,CompanyID,attrib1,attrib2),其也公司
  • VendorRelationship(RelationshipID,供應商ID,DistributorID,attrib1 ,attrib2)如果您需要跟蹤供應商和分銷商之間的連接詳細信息,請點擊此處

這會使公司,供應商和分銷商之間的耦合保持較低水平。

另一個例子是當一個類有一個狀態。很多時候,概念模型使用繼承來展示類是如何爲了處理不同的可能狀態而具有多態的子類的類的實例。當你必須改變實例的狀態並且你意識到你的指針會失效和/或受影響的實例可能被克隆,或者在集合中很難或保持更新時,這會導致問題。因爲您必須創建另一個類的新實例,然後將指針替換爲目標公司,如果有多個副本或實例包含在容器或列表中,則該指針可能會很困難。更簡單更乾淨的解決方案是讓類包含一個類型爲BaseClass的元素,它具有可能的子狀態。這樣,當您想要更改nobject的狀態時,可以通過簡單地用更新的具體類型替換status屬性來處理它。

1

您可能想使用Object Role Modeling查看數據庫設計。它從根本上使用您在問題陳述中使用的表達式類型,斷言對象(實體)相互關聯的角色。除其他功能外,它還可以生成完整的關係數據庫設計。

這是another reference

1

大多數DBMS s不適合這個問題,因爲他們缺乏所需的靈活性。我想這就是爲什麼Charles Bachman在1977年通過添加角色概念延伸了CODASYLnetwork data model(另請參閱The role data model revisitedPDF))。然而,恕我直言巴赫曼仍然受Hierachical data model影響太大,從業主/成員關係角度來看。

從概念上講,手頭的問題對應於圖形/網絡。如果將實體建模爲節點,則邊(關係)將攜帶標籤來指示角色。例如,一個訂單實體可能有一個「有序」關係連接到其他實體,可能是一個人,一個公司或其他實體。當您遵循「按順序排列」的關係時,您知道目標節點代表實現Orderer接口的實體。

在數學語言中,這裏需要的是一個帶標籤的定向多圖。你會發現在像Neo4j(我參與的開源項目)或RDF這樣的本地圖形數據庫中都是如此。在RDBMS之上還有RDF實現。也許圖的概念也可以給你一些關於如何從頭開始實現的提示。我還在我的博文Flexibility in data modeling中簡要討論角色概念。