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 个分类。我将有 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 将是整数。我正在尝试查看性能问题和其他问题。

总的来说,这行得通吗?或者我需要把它扔掉并从头开始。

4

2 回答 2

1

我不喜欢“最多三个”分类的三列。在我看来,最好有一个交叉引用表,允许您在组织和类型之间进行多对多映射,即表 ORGANISATION_GROUPS 与列 OrganisationId、OrgGroupId。

要解决能够查询指定的不同级别分类的问题,您可以设置此交叉引用表来保存实际分类,即 ORGANISATION_GROUPS 具有列:OrganisationId、ClassCode、CategoryCode、TypeCode。

这将使不同分类级别的查询变得非常容易。

为了使用此方案的引用完整性,我建议不要对 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

接下来,正如@Johnpick 建议的那样,您将在您的餐厅(或您需要的任何东西)表和仅包含复合主键的分类表之间有一个中间交叉引用表,作为两个表的主键的组件。

FOODSERVICE_CLASSIFICATION(Rest_Id,Class_Id)

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

建议限制它,以便在交叉引用表中只能引用 CLASSIFICATION 表的叶寄存器。

您查找所有餐馆的示例就像查找 REST 的所有子类别并在交叉引用表中搜索它们一样简单。这可以写在 Oracle 中的单个选择中(不确定其他 RDBMS)。

这样您就可以:

  • 为您的餐厅提供多种分类,但不限于 3 个类别。
  • 使用交叉引用表进行快速搜索。

请注意,假设您的分类就像一棵以基类别作为根的树,则此模式将起作用。相反,如果您需要更松散的分类,则可能需要使用标签方法。

顺便说一句,我也同意@John Pickup 的观点,在这种情况下最好使用真正的主键。

高温高压

于 2011-01-13T14:51:08.057 回答