在我们的权利框架中,每个“资源”(资源只是您希望通过为可以根据权限访问或不访问的角色分配权限来保护的任何实体)存储在resource
表中,如下所示
DESIGN1
RESOURCE TABLE
id (int) | namespace (varchar) | entity_id | black_listed (boolean)
1 | com.mycompany.core.entity1 |24 | false
2 | com.mycompany.core.entity2 |24 | false --note entity2
3 | com.mycompany.core.entity10 |3 | false -- note entity10
表中的每个资源代表不同的实体,例如使用实体,实体2,...,entity10。基本上只有entity1.id
,entity2.id
,entity3.id
,......等等。因为RESOURCE
表为各种实体保留资源 - entity_id
表中的RESOURCE
列不能具有正确的外键关系约束。我们正在考虑重构这个模式,例如关注
DESIGN 2
RESOURCE TABLE
id | description | entity1_id | entity2_id | entity3_id | entity4_id | entity5_id | entity6_id | black_listed(boolean)
1 | com.mycompany.core.entity1|24 | null | null | null |null | null
2 | com.mycompany.core.entity2|null | 24 | null | null |null | null
现在entity1_id
{f} entity1
表格entity2_id
entity2
null
{...}} {}这种方法的缺点是,对于所有列,该表总是具有entity resource
值。例如每行只能有一个null
。同样FK
似乎是反模式,尤其是resource
关系。另一种方法是规范化架构并为每个enitty
类型创建一个 V1 V2 V3
1 - SIERRA MIJAS (MA) - (001M02) 03/12/15 10:00 11,390
1 - SIERRA MIJAS (MA) - (001M02) 03/12/15 11:00 11,830
1 - SIERRA MIJAS (MA) - (001M02) 03/12/15 12:00 12,370
2 - SIERRA MIJAS2 (MA)2- (001M02) 03/12/15 13:00 14,550
2 - SIERRA MIJAS2 (MA)2- (001M02) 03/12/15 14:00 15,510
3 - SIERRA MIJAS3 (MA)3- (001M02) 03/12/15 15:00 15,220
表。但这对于维持并且很快成为一个头疼非常疯狂。不是说它的好坏,但看起来不像是一个实用的设计。
有没有更好的方法来设计这样一个表格,同时保持适当的FK重新加权?或者你会认可Design 2?
答案 0 :(得分:0)
您需要为所有具有id(代理主键)或entity_type,entity_id作为唯一键的实体创建一个表。
id entity_type entity_id
1 entity1 24
2 entity2 24
然后,您需要在RESOURCE中只有一列引用此表(比如实体)。您的RESOURCE表将如第一个示例中所示,但区别在于只有一个实体表,而不是10个。