PHP/MySQL - 使用3(通常不是2)映射表来继承权限
使CMS管理餐馆。简而言之,有餐厅有自己的部门。此外,还有需要分配给餐厅的餐点(所有分部可以看到这些餐点)或个别分部(所以只有选定的分部才能看到餐点)。PHP/MySQL - 使用3(通常不是2)映射表来继承权限
所以我创建的表:
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
所以,如果我要指派餐餐厅1和它的所有部门,我会创造记录:
meal_id | restaurant_id | division_id
1 | 1 | null
如果我要指派餐只分裂2-2,我会创造一个纪录:
meal_id | restaurant_id | division_id
1 | null | 4
有人会建议这样的方案是否正确?如何改进?我知道有人会说,我应该只创建映射表,有2条记录 - meal_id
和division_id
,并将餐分配给所有分部,而不是分配给餐馆,但这里有一个问题:如果餐厅1未来创建新分区,我希望新分区继承相同的权限(所以如果现有的餐点分配给餐厅而不是分部,所有未来的分部将继承餐厅的权限)。否则,我需要手动编辑每餐,并指定一个新的分区。
如果有人有兴趣,为什么我在restaurant_id
在第二个例子中使用null
,这是因为如果划分的父母在后面改变(师被分配到另一家餐厅),我并不需要扫描的映射表,并更改restaurant_id
价值存在。
若要评估您的型号是否为正确,最重要的方面是它满足所有要求。由于您的描述不完整,我们无法为您验证。你可以例如检查devisions是否可以同时属于几家餐馆。或者,如果您有其他属性(例如,分配给员工的分配人员,订单历史记录,优秀版税或您网站上的评分),那么当您将设计移至其他餐厅时,此更改或不会更改。你也可以把这个过程想象成在另一个餐厅里创造一个新的分支,并把所有的餐点分配给新的分支(或者可能有几个分支)。这是一个比正式问题更概念化的问题,如果是正确的(以及如果有更好的问题)将取决于要求。
正式,你的模型是正确的,只要你不设置在“权限”表都restaurant_id
和division_id
,因为这样的条目将没有任何意义。 (并且只要restaurant_id
不是您的devision
表中的密钥的一部分,根据您的描述,情况并非如此)。
你的表基本上是一个平坦的2级树,有一些隐含的条件。更一般的树可能看起来像
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
。如果您想将餐1分配给餐厅1及其所有分部,则会创建记录meal=1, id=1
。如果您想仅将餐1分配到“2-2”分区,您将创建一个记录meal=1, id=6
。
它隐含地阻止了你将某种情况下分配restaurant_id
和division_id
到一顿饭(这是你模型中提到的条件),因为这种组合不再存在。通过将父母移动到restaurant_id
和(第一级)孩子到devision_id
-表中的列,您“变平”树。
树不会执行餐厅不能属于另一家餐馆或您不能有子subde devisions。基本上,你把餐厅明确地视为一种特殊的分割(反之亦然)。所以这两个模型虽然在形式上是正确的,但它们有很多隐含的条件,它们会自动执行(如模型中的最大深度),您必须手动执行(例如不在模型中设置两列,或者树中的最大深度)或不支持(如模型中的细分)。您必须将其与您的要求进行比较。
网站说明:树实际上是数据库中分层数据的不好模型,因为它复杂(递归地)查询多个层次,并且有更好的模型。我只是为了简单而使用它 - 因为你只有一级孩子,这个限制不适用于你的情况。