0

データ モデルに苦労しています (データベースに MySQL を使用しています)。私は自分が思いついたものについて不安です。誰かがより良いアプローチを提案したり、参考資料を教えてくれたりしたら、私はそれを感謝します.

データには、さまざまな種類の組織が含まれます。3 レベルの分類 (クラス、カテゴリ、タイプ) を実行しようとしています。たとえば、「イタリアン レストラン」がある場合、次の分類になります。

フードサービス > レストラン > イタリアン

ただし、組織は複数のグループに属する場合があります。レストランでは、中華料理やイタリア料理も提供される場合があります。したがって、2つの分類に当てはまります

フード サービス > レストラン > イタリア
料理サービス > レストラン > 中華料理

分類参照テーブルは次のようになります。

ORG_CLASS (RowId、ClassCode、ClassName)

1, FOOD, Food Services

ORG_CATEGORY(RowId、ClassCode、CategoryCode、CategoryName)

1, FOOD, REST, Restaurants

ORG_TYPE (RowId、ClassCode、CategoryCode、TypeCode、TypeName)

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 つの分類を許可します。それぞれ ORG_TYPE の行を指す 3 つの GroupId があります。だから私は自分の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、カテゴリ、タイプを選択できるようになり、対応する GroupId に ORG_TYPE テーブルの行 ID が取り込まれる可能性があります。

検索中に、3 つの分類すべてを選択すると、より具体的になります。たとえば、

フード サービス > レストラン > イタリア語が条件で、where 句は次のようになります。'where OrgGroupId1 = 100'

2 つのレベルのみを選択した場合

フードサービス > レストラン

私はやらなければならない'where OrgGroupId1 in (100,101,102,103,104,105, .....)'- そのリストには百があるかもしれません

クラスレベルの検索を禁止します。つまり、クラスとカテゴリの選択を強制します

Id は整数になります。パフォーマンスの問題やその他の問題を確認しようとしています。

全体として、これは機能しますか?または、これを捨てて最初からやり直す必要があります。

4

2 に答える 2

1

「最大3つ」の分類に3つの列があるのは好きではありません。私の意見では、組織とタイプの間の多対多のマッピングを可能にする相互参照テーブル、つまり、列 OrganizationId、OrgGroupId を持つテーブル ORGANISATION_GROUPS を使用する方がよいでしょう。

指定されたさまざまなレベルの分類を照会できるという問題を解決するには、この相互参照テーブルを設定して実際の分類を保持することができます。

これにより、さまざまな分類レベルでのクエリが非常に簡単になります。

このスキームで参照整合性を機能させるには、ORG_* テーブルに代理整数キーを使用するのではなく、主キーを実際の一意のキー、つまり ORG_TYPE の ClassCode、CategoryCode、TypeCode に設定することをお勧めします。

于 2011-01-13T12:17:35.520 に答える
0

あなたのデザインに見られる問題は、それが少し固いということです。より柔軟なアプローチとして、次の方法を検討することをお勧めします。

まず、クラス、カテゴリ、タイプ、およびその他の分類タイプのテーブルを作成します。このテーブルは自動参照されます。すべてのレジスタには、次のように直接の親を参照するフィールドがあります。

分類 (ID、説明、Parent_Id)

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

次に、@John ピックアップが示唆したように、レストラン (または必要なもの) テーブルと分類テーブルの間に中間相互参照テーブルがあり、複合主キーのみを含み、そのコンポーネントが両方のテーブルの主キーになります。

FOODSERVICE_CLASSIFICATION (Rest_Id、Class_Id)

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

CLASSIFICATION テーブルのリーフ レジスタのみが相互参照テーブルで参照できるように制限することをお勧めします。

すべてのレストランを検索する例は、REST のすべての子カテゴリを検索し、それらを相互参照テーブルで検索するのと同じくらい簡単です。これは、Oracle では単一の選択で記述できます (他の RDBMS についてはわかりません)。

このようにして、次のことができます。

  • 3 つのカテゴリに限定されることなく、レストランを複数のカテゴリに分類できます。
  • 相互参照表を使用してクイック検索を行います。

このスキーマは、カテゴリ化がルートとして機能する基本カテゴリを持つツリーのようなものであると仮定して機能します。代わりに、より緩やかな分類が必要な場合は、おそらくタグのアプローチが必要になるでしょう。

ところで、この場合は実際の主キーを使用する方が良いという@John Pickupにも同意します。

HTH

于 2011-01-13T14:51:08.057 に答える