数据库架构多对多对多

时间:2014-01-06 11:48:19

标签: mysql database database-design architecture data-modeling

我遇到了如何更改数据库模型的问题:

现在我们预定了表格Categories 我们可以说表PlacesPeople可以分配给类别,所以它看起来像这样:

People <=> PeopleCategories <=> Categories <=> PlaceCategories <=> Places

(人们可以有很多类别,类别可以有很多人,地方可以有很多类别,类别可以有很多地方)

但现在有了新的要求:

在个人资料中显示基于类别的所有相应位置(到目前为止没有问题)并添加一个勾选框来建模某些属性(例如在前端显示为最喜欢的位置)。来自Place profile的另一侧的相同内容标记了分配给至少一个具有勾选框的相同类别的人。

我想知道是否有一些很好的方式对此进行建模 - 我想到的唯一一件事是添加一个新的PeoplePlaces表,但我必须手动控制人或地方是否没有改变他们的类别它们仍然被分配等等 - 我将不得不在应用层管理数据的一致性存在很大问题。

我可能做的第二件事是完全删除类别并仅在PeoplePlaces级别上进行操作但我会失去一些用户的简单性:用户可以选择10个预定义类别,以便人与人之间的链接和地方在前端是非常自动的,只有管理员应该看到哪些地方被分配给哪些人并管理我正在谈论的勾选框

您对此架构有何建议?提前致谢! (如果它对某种解决方案很重要,那么这是一个MySQL数据库,但这更像是一种通用架构)

2 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,您需要确保某人赞成与该人本人相同类别的地方?

如果是这样,请查看以下模型:

enter image description here

我们不直接链接“端点”,而是“链接链接”。这允许我们将PERSON_CATEGORY.CATEGORY_ID和PLACE_CATEGORY.CATEGORY_ID迁移到FAVORED_PLACE表中,并在那里“合并”它们,产生一个FAVORED_PLACE.CATEGORY_ID字段(注意上图中的FK1,FK2)。

因此,如果一个人与某个地方相连,那必须通过一个共同的类别来完成。

此外,由于CATEGORY_ID在PERSON_CATEGORY的PK之外,因此人和地的特定组合只能使用一次,即使它们通过多个类别匹配。实际上,您选择一个常见类别为“特殊”。如果从特殊类别中删除某个地点(或人),您需要选择另一个常用类别作为特殊类别。如果没有剩下常见类别,则不再允许FAVORED_PLACE中的相应行存在。

答案 1 :(得分:0)

我认为删除类别不是一个好主意。

你正在做的是引入一个新的实体--PersonsFavouritePlaces--它直接与People和Place相关,而不是通过Category。明智的是,PersonsFavouritePlace仅限于按类别链接的人员和地点,因此它应该引用PeopleCategories和PlaceCategories而不是People和Category表。

表格如下:

create table PeopleFavourtiePlace
(
  ID int not null, -- Primary key
  PeopleCategoriesId int not null, -- FK to PK of PerpleCategories
  PlaceCategoriesId int not null -- FK to PK of PlaceCategories
)

我不知道MySql是否支持级联删除,但如果是这样,那么两个FK应该打开,所以如果有人取消选择一个类别(删除PeopleCategories行),如果它链接到该类别中的一个喜欢的地方它也会得到删除。

但是,如果一个人通过多个类别链接到一个地方,那么它会变得复杂....