0

これが少し広範である場合は申し訳ありませんが、私は数日間構造に取り組んでおり、これを行うための最もクリーンで最も効率的な方法を理解できないようです. 今のところ作成した表を共有することはできますが、適切な図のあり方にはほど遠いと思います。

私の問題を少し説明させてください。店舗、国、地区、カテゴリがあります。各店舗は、店舗支店の操作を可能にするさまざまな国/地区に属することができます。もちろん、店舗は複数のカテゴリに属する​​こともできます。たとえば、店舗 X は食品と飲料とナイト クラブの両方に属することができます。国には複数の地区と店舗があり、店舗には多くの国と地区がある場合があります。

C# を使用してアプリケーションを作成していますが、データ層のオブジェクトとクラスの作成に問題はありません。しかし、特定の基準に基づいてデータを操作およびフィルタリングするには、適切な MSSQL 構造が必要です。

最も重要な基準は次のとおりです。最初のステップとして国を調べ、次にその国の店舗をグローバル ビューとして検索します。次に、その国の地区やカテゴリに基づいて店舗を並べ替えることが重要です。

私が今持っているものを共有する必要があるかどうか教えてください。しかし、私はスタック オーバーフローでこの質問をしているので、私がこれを間違った方法で行っていると推測できます。

とにかく、この問題に光を当てて、物事を適切に行う方法を説明していただければ幸いです。

前もって感謝します。

4

4 に答える 4

4

多対多の関係がある場合 (たとえば、1 つの地区に多くの店舗が含まれている場合や、1 つの店舗が多くの地区に含まれている場合など)、それらのエンティティ間で相互参照テーブルを使用する必要があります。

私は、特定の地区が 1 つの国にのみ含まれている可能性があると想定しています。あなたのシナリオをモデル化する方法は次のとおりです。

countries(country_id [PK], name, ...)
districts(district_id [PK], country_id [FK], name, ...)
districts_has_stores(district_id [PK], store_id [PK])

stores(store_id [PK], name, ...)

categories_has_stores(category_id [PK], store_id [PK])
categories(category_id [PK], name, ...)

ER では:

小胞体図

districts_has_storesおよびcategories_has_storesは、エンティティ間の多対多の関係を表す相互参照テーブルです。

このモデルに基づいて、特定の国のすべての店舗を取得し、次の SQL を使用して地区名で店舗を並べ替えることができます。

SELECT
    c.*
FROM 
    districts a
INNER JOIN 
    districts_has_stores b ON a.district_id = b.district_id
INNER JOIN
    stores c ON b.store_id = c.store_id
WHERE
    a.country_id = <country_id here>
ORDER BY
    a.name

各国の店舗数を取得する:

SELECT
    a.country_id, 
    COUNT(*) AS store_count
FROM
    districts a
INNER JOIN
    districts_has_stores b ON a.district_id = b.district_id
GROUP BY
    a.country_id

編集: この回答に対するコメントに従って、category_id を持つすべてのストアを取得する1方法の例を次に示します。

SELECT
    b.*
FROM
    categories_has_stores a
INNER JOIN
    stores b ON a.store_id = b.store_id
WHERE
    a.category_id = 1

特定の category_id ( ) 内のすべての店舗を取得し1、結果をフィルタリングして、地区4または5内の店舗のみを含めます。

SELECT DISTINCT
    b.*
FROM
    categories_has_stores a
INNER JOIN
    stores b ON a.store_id = b.store_id
INNER JOIN
    districts_has_stores c ON b.store_id = c.store_id
WHERE
    a.store_id = 1 AND
    c.district_id IN (4,5)
于 2012-07-07T11:44:16.200 に答える
1

ここに画像の説明を入力

非常に簡単です。StoryCategory を使用して、「多くの店舗が多くのカテゴリを持つことができる」問題を解決できます。District テーブルと Country テーブルを使用すると、店舗の場所を格納できます。

データベース設計の知識を広げるために、次のドキュメントを参照することをお勧めします。

多対多

10の役に立つ記事

于 2012-07-07T11:50:33.393 に答える
0

以下はあなたのために働くべきだと思います。

Countries
=========
CountryId, CountryName

Districts
=========
DistrictId, CountryId, DistrictName

Stores
=========
StoreId, DistrictId, Storename


Categories
=========
CategoryId, Categoryname


StoreCategories
=========
Storecategoryid, StoreId, CategoryId
于 2012-07-07T11:29:09.150 に答える
0

ID 列を持つ国テーブルがあります。各ストアは「カテゴリ」にすることができます。ストア ID とカテゴリ テーブルの ID を持つストア テーブルの子テーブルである関連付けテーブルが必要です。各ストアは国に属しているため、ストア テーブルには Country テーブルの国の ID が格納されます。カテゴリと同様に、District テーブルには、District と Country の ID を格納する子テーブルがあります (各地区は複数の国を持つことができるため)。

テーブルの保存

  • ID INT IDENTITY PK
  • カテゴリ FK
  • 国 FK (実際に住んでいる場所、1 対 1)
  • 地区FK

カテゴリー表

  • ID INT IDENTITY PK

StoreCategory テーブル

  • StoreID FK
  • カテゴリーID FK

国表

  • ID INT IDENTITY PK

地区表

  • ID INT IDENTITY PK

地区国テーブル

  • 地区 ID FK
  • CountryID FK
于 2012-07-07T11:22:33.693 に答える