我正在为一个数据模型而挣扎(我使用MySQL作为数据库)。我对我想出的东西感到不安。如果有人能提出一个更好的方法,或向我指出一些参考资料,我将不胜感激。
这些数据将有许多类型的组织。我试图做一个三级分类(类别,类别,类型)。如果我有‘意大利餐厅’,它将有以下分类
餐饮服务>餐厅>意大利菜
然而,一个组织可能属于多个组。一家餐馆也可以提供中式和意大利式的服务。所以它可以分为两类。
餐饮服务>餐厅>意大利菜
餐饮>餐饮>中餐
分类参考表如下:
ORG_CLASS (RowId,ClassCode,ClassName)
1, FOOD, Food ServicesORG_CATEGORY(RowId,ClassCode,CategoryCode,CategoryName)
1, FOOD, REST, RestaurantsORG_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个分类。我将让每个GroupIds都指向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,类别、类型和相应的GroupId可以由ORG_TYPE表中的rowid填充。
在搜索过程中,如果选择了所有三种分类,就会更加具体。例如,如果
食品服务>餐馆>意大利是标准,where条款是'where OrgGroupId1 = 100'
如果只选择两个级别
食物服务>食肆
我得去做'where OrgGroupId1 in (100,101,102,103,104,105, .....)' --名单上可能有100个
我将不允许类级搜索。也就是说,我将强制选择一个类和类别。
Ids将是整数。我想看看性能问题和其他问题。
总的来说,这能行吗?否则我就得把这个扔了从头开始。
发布于 2011-01-13 12:17:35
我不喜欢有三栏的“多达三”的分类。在我看来,最好有一个交叉引用表,允许在组织和类型之间进行多到多的映射,即带有OrganisationId、OrgGroupId列的表OrgGroupId。
要解决能够查询指定的不同级别的分类的问题,可以设置这个交叉引用表来保存实际的分类,即ORGANISATION_GROUPS有列: OrganisationId、ClassCode、CategoryCode、TypeCode。
这将使查询在不同级别的分类非常容易。
为了使用此方案的引用完整性,我建议不对ORG_*表使用代理整数键,而是将主键设置为真正的唯一键,即ClassCode、CategoryCode、TypeCode For ORG_TYPE。
发布于 2011-01-13 14:51:08
我在你的设计中看到的问题是它有点僵化。您可能需要考虑的一种更灵活的方法是:
首先,您将有一个用于类、类别、类型和任何其他分类类型的表。这张表是自动引用的。所有寄存器都有一个引用其直系亲属的字段,如下所示:
分类(Id、描述、Parent_Id)
ITAL, Italian, REST
CHIN, Chinese, REST
MEXI, Mexican, REST
REST, Restaurant, FOOD接下来,就像约翰皮卡建议的那样,在你的餐厅(或你需要的任何东西)表和分类表之间有一个中间的交叉参考表,而分类表只包含一个复合主键,是两个表的主键。
FOODSERVICE_CLASSIFICATION (Rest_Id,Class_Id)
100, ITAL
100, CHIN
101, MEXI
102, CHIN最好对其加以限制,以便在交叉参考表中只能引用分类表的叶寄存器。
你寻找所有餐馆的例子很简单,就像在交叉参考表中寻找所有儿童类别的休息和搜索它们一样简单。这可以在Oracle中的单个select中编写(不确定其他RDBMS)。
这样你就可以:
。
请注意,如果您的分类就像一棵以基本类别作为根的树,则此模式将起作用。如果您需要更宽松的分类,您可能需要一种标记方法。
顺便说一句,我也同意约翰皮卡的观点,在这种情况下最好使用真正的主键。
HTH
https://stackoverflow.com/questions/4679815
复制相似问题