首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP/MySQL -具有3列(而不是通常的2列)的映射表以继承权限

PHP/MySQL -具有3列(而不是通常的2列)的映射表以继承权限
EN

Stack Overflow用户
提问于 2017-08-01 16:07:10
回答 1查看 71关注 0票数 0

制作CMS来管理餐厅。简而言之,有些餐厅有自己的部门。此外,还需要将餐饮分配给餐厅(以便其所有部门都能看到这些餐食)或个别部门(因此只有选定的部门才能看到餐食)。

所以我创建了表:

代码语言:javascript
复制
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及其所有部门,我将创建记录:

代码语言:javascript
复制
meal_id | restaurant_id | division_id
      1 |             1 | null

如果我只想将meal分配给2-2师,我将创建一条记录:

代码语言:javascript
复制
meal_id | restaurant_id | division_id
      1 |          null | 4

有人能告诉我这样的方案是否正确吗?如何改进呢?我知道有人会说我应该只创建包含两条记录的映射表- meal_iddivision_id,并将meal分配给所有部门,而不是分配给餐厅,但问题是:如果餐厅1在未来创建了新部门,我希望新部门继承相同的权限(因此,如果现有的meal被分配给餐厅,而不是部门,所有未来的部门都将继承餐厅的权限)。否则,我将需要手动编辑每顿饭,并为其分配一个新的部门。

如果有人对我为什么在第二个例子中使用restaurant_id中的null感兴趣,那是因为如果division的父级后来被更改了(division被分配给了另一个餐厅),我就不需要扫描映射表并在那里更改restaurant_id值。

EN

回答 1

Stack Overflow用户

发布于 2017-08-01 18:46:40

要评估您的模型是否正确,最重要的方面是它是否满足所有需求。由于您的描述不完整,我们无法为您验证这一点。例如,你可以检查偏差是否可以同时属于几家餐厅。或者,如果您有其他偏差属性(例如,分配给某部门的员工、订单历史记录、网站上的未付版税或评级),当您将部门转移到另一家餐厅时,这些属性会发生变化或保持不变。你也可以把这个过程想象成在另一家餐厅内创建一个新的部门,并将所有的饭菜分配给新的部门(或者可能有几个偏差)。这更多的是一个概念上的问题,而不是一个正式的问题,它是否正确(以及是否有更好的)将取决于需求。

从形式上讲,您的模型是正确的,只要您从未在“权限”表中同时设置restaurant_iddivision_id,因为这样的条目没有任何意义。(只要restaurant_id不是您的devision表中键的一部分,根据您的描述,情况就不是这样)。

您的表基本上是一个带有一些隐式条件的扁平化的两级树。更通用的树可能如下所示

代码语言:javascript
复制
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_iddivision_id都分配给一顿饭的情况(这是您的模型中提到的情况),因为这样的组合不再存在。您通过将父对象移动到restaurant_id中,并将(1级)子对象移动到devision_id-column of your meals_to_restaurants_divisions-table中,从而“展平”了树。

树不会强制一家餐厅不能属于另一家餐厅,或者你不能有子-子偏差。基本上,您显式地将餐厅视为一种特殊的划分(反之亦然)。

因此,虽然这两个模型在形式上都是正确的,但它们有很多隐式条件,它们会自动实施(如模型中的最大深度),而您必须手动实施(如不在模型中同时设置两列或树中的最大深度)或不支持的条件(如模型中的细分)。您必须将其与您的需求进行比较。

站点注释:对于数据库中的分层数据,树实际上是一个糟糕的模型,因为(递归地)查询几个层次会变得复杂,而且还有更好的模型。我只是为了简单起见而使用它--因为你只有1级的孩子,所以这个限制不适用于你的情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45432291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档