可空的外键列非规范化表与许多规范化表

时间:2015-12-03 23:40:17

标签: sql database postgresql database-schema

在我们的权利框架中,每个“资源”(资源只是您希望通过为可以根据权限访问或不访问的角色分配权限来保护的任何实体)存储在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.identity2.identity3.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?

1 个答案:

答案 0 :(得分:0)

您需要为所有具有id(代理主键)或entity_type,entity_id作为唯一键的实体创建一个表。

 id   entity_type    entity_id
 1    entity1        24
 2    entity2        24

然后,您需要在RESOURCE中只有一列引用此表(比如实体)。您的RESOURCE表将如第一个示例中所示,但区别在于只有一个实体表,而不是10个。