制作CMS来管理餐厅。简而言之,有些餐厅有自己的部门。此外,还需要将餐饮分配给餐厅(以便其所有部门都能看到这些餐食)或个别部门(因此只有选定的部门才能看到餐食)。
所以我创建了表:
restaurant_id | restaurant_name
1 | Restaurant 1
2 | Restaurant 2
division_id | restaurant_id | division_name
1 | 1 | 1-1
2 | 1 | 1-2
3 | 2 | 2-1
4 | 2 | 2-2
meal_id | meal_name
1 | Steak还创建了包含3列的映射表meals_to_restaurants_divisions - meal_id, restaurant_id, division_id
因此,如果我想将meal分配给Restaurant 1及其所有部门,我将创建记录:
meal_id | restaurant_id | division_id
1 | 1 | null如果我只想将meal分配给2-2师,我将创建一条记录:
meal_id | restaurant_id | division_id
1 | null | 4有人能告诉我这样的方案是否正确吗?如何改进呢?我知道有人会说我应该只创建包含两条记录的映射表- meal_id和division_id,并将meal分配给所有部门,而不是分配给餐厅,但问题是:如果餐厅1在未来创建了新部门,我希望新部门继承相同的权限(因此,如果现有的meal被分配给餐厅,而不是部门,所有未来的部门都将继承餐厅的权限)。否则,我将需要手动编辑每顿饭,并为其分配一个新的部门。
如果有人对我为什么在第二个例子中使用restaurant_id中的null感兴趣,那是因为如果division的父级后来被更改了(division被分配给了另一个餐厅),我就不需要扫描映射表并在那里更改restaurant_id值。
发布于 2017-08-01 18:46:40
要评估您的模型是否正确,最重要的方面是它是否满足所有需求。由于您的描述不完整,我们无法为您验证这一点。例如,你可以检查偏差是否可以同时属于几家餐厅。或者,如果您有其他偏差属性(例如,分配给某部门的员工、订单历史记录、网站上的未付版税或评级),当您将部门转移到另一家餐厅时,这些属性会发生变化或保持不变。你也可以把这个过程想象成在另一家餐厅内创建一个新的部门,并将所有的饭菜分配给新的部门(或者可能有几个偏差)。这更多的是一个概念上的问题,而不是一个正式的问题,它是否正确(以及是否有更好的)将取决于需求。
从形式上讲,您的模型是正确的,只要您从未在“权限”表中同时设置restaurant_id和division_id,因为这样的条目没有任何意义。(只要restaurant_id不是您的devision表中键的一部分,根据您的描述,情况就不是这样)。
您的表基本上是一个带有一些隐式条件的扁平化的两级树。更通用的树可能如下所示
id | parent
---+-------
1 | null -- restaurant "1" (has no parent)
2 | 1 -- devision "1-1"
3 | 1 -- devision "1-2"
4 | null -- restaurant "2"
5 | 4 -- devision "2-1"
6 | 4 -- devision "2-2"在此树中,餐厅将被视为正常的分区(或者分区将被视为子餐厅),并且您可以仅将餐食分配给该id。如果要将meal 1分配给restaurant 1及其所有分区,则需要创建记录meal=1, id=1。如果您只想将meal 1分配给部门"2-2",则需要创建一个记录meal=1, id=6。
它隐含地防止了您将restaurant_id和division_id都分配给一顿饭的情况(这是您的模型中提到的情况),因为这样的组合不再存在。您通过将父对象移动到restaurant_id中,并将(1级)子对象移动到devision_id-column of your meals_to_restaurants_divisions-table中,从而“展平”了树。
树不会强制一家餐厅不能属于另一家餐厅,或者你不能有子-子偏差。基本上,您显式地将餐厅视为一种特殊的划分(反之亦然)。
因此,虽然这两个模型在形式上都是正确的,但它们有很多隐式条件,它们会自动实施(如模型中的最大深度),而您必须手动实施(如不在模型中同时设置两列或树中的最大深度)或不支持的条件(如模型中的细分)。您必须将其与您的需求进行比较。
站点注释:对于数据库中的分层数据,树实际上是一个糟糕的模型,因为(递归地)查询几个层次会变得复杂,而且还有更好的模型。我只是为了简单起见而使用它--因为你只有1级的孩子,所以这个限制不适用于你的情况。
https://stackoverflow.com/questions/45432291
复制相似问题