在一般化链接表

时间:2016-12-16 21:48:22

标签: sql database postgresql relational-database relational

我正在使用具有许多类型实体的系统进行一些工作,这些实体可能会或可能不会访问许多类型的资源。设置这些表我有一个结构,我设置一个Entity_Sequence和一个资源序列,然后为每个不同的实体和每个不同的资源创建一个链接表,以将它们与各自的序列相关联。

例如,我有一个Users_Entities_Link表,其中user_id列引用User,而entity_id是bigint默认nextval(Entity_Sequence)。

最重要的是,这个结构是(entity_id,resource_id)的Entities_Resources_Access,表示该实体是否有权访问该资源。但是,鉴于这些实体中的每一个都可以与任何一个实体链接表相关,并且对于资源和每个资源表都是相同的,我试图弄清楚处理这种关系的最佳方法是什么。这似乎是一个相当罕见的问题,所以我无法在其他地方找到帮助。

我能确定自己的最好方法是在每个实体或资源链接表上运行一个删除后触发器,以检查访问表中是否存在实体或资源,但添加时需要处理很多债务在新的潜在实体或资源中。

对于如何处理访问许多资源问题的这么多实体的结构问题,或者如何更好地处理序列关系,是否有更好的解决方案?我是否需要添加一个虚拟实体表和一个虚拟资源表,每个表只有一个ID用于链接和访问表以将外键链接到?如果我拥有大量任何给定的实体或资源,这似乎是浪费了很多空间,而且如果它在相关表中删除某行时没有任何引用它就浮动而我必须手动取消链接(如用户)

以下是目前设计的设置:

Table some_entity_entity_link
    some_entity_id FK refs some_entity(id)
    entity_id not null default nextval(entity_sequence)
Table another_entity_entity_link
    another_entity_id FK refs another_entity(id)
    entity_id not null default nextval(entity_sequence)


Table some_resource_resource_link
    some_resource_id FK refs some_resource(id)
    resource_id not null default nextval(resource_sequence)
Table another_resource_resource_link
    another_resource_id FK refs another_resource(id)
    resource_id not null default nextval(resource_sequence)

Table entities_resources_access
    entity_id
    resource_id

0 个答案:

没有答案