0

如果这有点宽泛,我很抱歉,但我已经研究了几天的结构,我似乎无法找出最干净和最有效的方法来做到这一点。我可以分享我现在创建的表格,但我真的认为它并不接近正确的图表应该是什么样的。

让我稍微描述一下我的问题:我有商店、国家、地区、类别。每个商店可以属于不同的国家/地区,从而实现商店分店操作。当然,一家商店也可以属于多个类别,例如,商店 X 可以同时属于 Food and Beverages 和 Night Clubs。一个国家将有多个地区和商店,一个商店可以有许多国家和地区。

我正在使用 C# 编写我的应用程序,并且创建数据层对象和类没有问题。但是我需要正确的 MSSQL 结构来根据给定的标准操作和过滤数据。

最重要的标准是:第一步是通过国家/地区,然后在该国家/地区内定位商店作为全球视图,然后根据该国家/地区内的地区和/或类别对商店进行排序很重要。

如果您需要我分享我现在拥有的东西,请告诉我,但是由于我在 Stack Overflow 上问这个问题,您可以猜到我做错了。

无论如何,如果您能对这个问题有所了解并解释应该如何正确完成事情,我将不胜感激。

提前致谢。

4

4 回答 4

4

每当您有多对多关系时(例如,一个地区可能包含许多商店;一个商店可能包含许多地区),您将需要在这些实体之间使用交叉引用表。

我假设一个特定的地区可能只被一个国家所包含。以下是我将如何模拟您的方案:

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) 中的所有商店并过滤结果以仅包括位于 Districts45中的那些商店。

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

您将有一个带有标识列的国家/地区表。每个商店都可以“成为”类别,您必须有一个关联表,它是商店表的子表,该表将具有商店 ID 和类别表中的 ID。每个商店都属于一个国家/地区,因此您的商店表将存储 Country 表中的国家/地区 ID。与 Category 类似,您的 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

区国家表

  • 区号 FK
  • 国家 ID FK
于 2012-07-07T11:22:33.693 回答
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 回答