2017-08-01 14 views
0

使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_iddivision_id,并将餐分配给所有分部,而不是分配给餐馆,但这里有一个问题:如果餐厅1未来创建新分区,我希望新分区继承相同的权限(所以如果现有的餐点分配给餐厅而不是分部,所有未来的分部将继承餐厅的权限)。否则,我需要手动编辑每餐,并指定一个新的分区。

如果有人有兴趣,为什么我在restaurant_id在第二个例子中使用null,这是因为如果划分的父母在后面改变(师被分配到另一家餐厅),我并不需要扫描的映射表,并更改restaurant_id价值存在。

回答

0

若要评估您的型号是否为正确,最重要的方面是它满足所有要求。由于您的描述不完整,我们无法为您验证。你可以例如检查devisions是否可以同时属于几家餐馆。或者,如果您有其他属性(例如,分配给员工的分配人员,订单历史记录,优秀版税或您网站上的评分),那么当您将设计移至其他餐厅时,此更改或不会更改。你也可以把这个过程想象成在另一个餐厅里创造一个新的分支,并把所有的餐点分配给新的分支(或者可能有几个分支)。这是一个比正式问题更概念化的问题,如果是正确的(以及如果有更好的问题)将取决于要求。

正式,你的模型是正确的,只要你不设置在“权限”表都restaurant_iddivision_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_iddivision_id到一顿饭(这是你模型中提到的条件),因为这种组合不再存在。通过将父母移动到restaurant_id和(第一级)孩子到devision_id-表中的列,您“变平”树。

树不会执行餐厅不能属于另一家餐馆或您不能有子subde devisions。基本上,你把餐厅明确地视为一种特殊的分割(反之亦然)。所以这两个模型虽然在形式上是正确的,但它们有很多隐含的条件,它们会自动执行(如模型中的最大深度),您必须手动执行(例如不在模型中设置两列,或者树中的最大深度)或不支持(如模型中的细分)。您必须将其与您的要求进行比较。

网站说明:树实际上是数据库中分层数据的不好模型,因为它复杂(递归地)查询多个层次,并且有更好的模型。我只是为了简单而使用它 - 因为你只有一级孩子,这个限制不适用于你的情况。