2011-01-13 39 views
0

我正在努力與數據模型(我使用MySQL的數據庫)。我對自己的想法感到不安。如果有人可以提出更好的方法,或者指出一些參考問題,我將不勝感激。掙扎與數據建模問題

該數據將有許多類型的組織。我正在嘗試做一個3級分類(類,類別,類型)。說,如果我有「意大利餐廳」,這將有如下分類

食品服務>餐館>意大利

然而,一個組織可以屬於多個組。一家餐館也可以服務中國和意大利。因此,將適用於2個分類

食品服務>餐館>意大利
食品服務>餐館>中國

分級參考表將是這樣的:

ORG_CLASS(RowId的,ClassCode,類名)

1, FOOD, Food Services 

ORG_CATEGORY(RowId的,ClassCode,CategoryCode ,類別名稱)

1, FOOD, REST, Restaurants 

ORG_TYPE(RowId的,ClassCode,CategoryCode,類型碼,類型名)

100, FOOD, REST, ITAL, Italian 
101, FOOD, REST, CHIN, Chinese 
102, FOOD, REST, SPAN, Spanish 
103, FOOD, REST, MEXI, Mexican 
104, FOOD, REST, FREN, French 
105, FOOD, REST, MIDL, Middle Eastern 

實際的數據表將是這樣的:

我將允許最多組織3個分類。我將有3個GroupId,每個指向ORG_TYPE中的一行。所以,我有我的ORGANIZATION_TABLE

ORGANIZATION_TABLE(OrgGroupId1,OrgGroupId2,OrgGroupId3,ORGNAME,OrgAddres)

100,103,NULL,MyRestaurant1, MyAddr1 
100,102,NULL,MyRestaurant2, MyAddr2 
100,104,105, MyRestaurant3, MyAddr3 

在添加數據,一個對話框,可以讓用戶選擇clssa,類別,類型和相應的可以使用ORG_TYPE表中的rowid填充GroupId。

搜索過程中,如果選擇了所有三種分類,它將更具體。例如,如果

食品服務>餐館>意大利人的標準,where子句是'where OrgGroupId1 = 100'

如果只有2個水平選擇

餐飲服務>餐廳

我必須做的'where OrgGroupId1 in (100,101,102,103,104,105, .....)' - 該列表中可能有一百個

我將不允許進行課程級別搜索。那就是我會強制選擇一個班級和類別

這些ID是整數。我正在嘗試查看性能問題和其他問題。

總的來說,這項工作?或者我需要拋出並從頭開始。

+0

這可能是矯枉過正你的目的,但有關管理的層次化數據的好文章:http://dev.mysql.com/tech-resources/articles/hierarchical-data.html – trickwallett 2011-01-13 12:14:08

+0

感謝鏈接。這確實是一個很好的參考。它確實讓我有另一種分類選擇。文章中的這種方法更加靈活,並且不會限制分類的數量級別。 – rpat 2011-01-14 17:01:19

+0

@trickwallet:該文章不在此地址。它現在在這裏:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ – 2011-08-05 18:44:44

回答

1

我不喜歡有三列「最多三個」分類。在我看來,最好有一個交叉引用表,允許在組織和類型之間進行多對多映射,即將ORGANISATION_GROUPS與列OrganisationId,OrgGroupId關聯起來。

要解決查詢指定的不同級別的問題,您可以設置此交叉引用表來保存實際的分類,即ORGANISATION_GROUPS取而代之具有列:OrganisationId,ClassCode,CategoryCode,TypeCode。

這將使查詢在不同級別的分類非常容易。

爲了參照完整性來處理這個方案,我建議不要爲ORG_ *表使用代理整型鍵,而應將主鍵設置爲真正的唯一鍵,即ClassCode,CategoryCode和TypeCode for ORG_TYPE。

0

我在你的設計中看到的問題是它有點僵硬。您可能需要考慮的更靈活的方法如下:

首先,您需要一個表格,類別,類型和任何其他分類類型。該表將被自動引用。所有寄存器將有一個字段指的是其直接父,如以下:

分類(ID,描述,PARENT_ID)

ITAL, Italian, REST 
CHIN, Chinese, REST 
MEXI, Mexican, REST 
REST, Restaurant, FOOD 

接下來你將有,作爲@約翰拾取建議的,一箇中間橫 - 餐館(或任何你需要的)表和分類表之間的參考表,它只包含一個複合主鍵,它的組成部分是兩個表的主鍵。

FOODSERVICE_CLASSIFICATION(Rest_Id,類標識碼)

100, ITAL 
100, CHIN 
101, MEXI 
102, CHIN 

這將是可取的,以限制它使得只有分類表的葉寄存器可以在交叉引用表被引用。

您尋找所有餐館的例子就像查找REST的所有子類別並在交叉引用表中搜索它們一樣簡單。這可以寫入Oracle中的單個選擇(不確定其他RDBMS)。

這種方式,您可以:

  • 有你的餐館多種分類,而不限於3個類別。
  • 使用交叉引用表進行快速搜索。

請注意,如果您的分類類似於以基本類別作爲根的樹,則此模式可行。如果您需要更寬鬆的分類,您可能需要使用標籤方法。

順便說一下,我也同意@John Pickup在這種情況下最好使用真正的主鍵。

HTH