"组中的所有条目"数据库设计Aproach

时间:2015-10-01 23:06:16

标签: database database-design relational-database relationship database-schema

由于问题的性质,搜索类似的问题或文章非常困难,因为关键词具有广泛的含义。所以,如果有类似的问题,请原谅我。

问题。 (简化的)

我有一个用户表。表用户

每个用户都拥有自己的资产 (表资产用户ID的外键)

2用户可以是合作者。每个用户选择他想要与另一个共享的资产。为了在此合作中使用,创建了包含user1和user2资产的共享组。 (表组FK CooperationId)(组表中的联接表资产)(表UserCooperation) < / p>

现在是棘手的部分。

在某些情况下,用户可能希望与用户共享其资产的全部。为了避免每次手动添加新资产,我们都需要一个解决方案。

可能的方法。(按个人喜好排序,考虑到排队等候的表现)。

  1. 拥有额外的表格(用户的所有资产)。所以 查询将首先检查用户是否在组中添加了他的所有资产 并跳过每个资产ID的查询,而是通过userId查询。
  2. 在合作或组表上有 2个bool标志,表示一个用户是否与另一个用户共享所有资产,而不是一个组。查询将首先读取此信息,如果为true,则将跳过组逻辑,并仅按用户ID进行查询。
  3. 在共享表上同时保留 2个bool标志,但要表明创建时任何资产都必须包含在“资产组”表中。因此,业务逻辑将处理在该组上插入每个新资产。查询逻辑在这种情况下不会改变
  4. 替代结构。

    每个用户都有自己的团队并加入与他的团队的合作,而不是拥有合作的共享团队。 (虽然如果没有合作,一个团体没有任何意义,并且All In Group问题保持不变。)

1 个答案:

答案 0 :(得分:2)

您可能考虑的一种方案是定义资产类,该资产类可以是直接资产或资产组。资产组可以访问一个或多个资产。因此,用户可以与另一个用户共享资产或资产类别,其中包含部分或全部资产。

create table AssetClasses(
    ID         int not null auto incrementing primary key,
    Type       char( 1 ) check( Type in( 'A', 'G' )),
    ...,
    constraint UQ_AssetClass_IDType unique( ID, Type )
);
create table Assets(
    ID         int not null primary key,
    ClassType  char( 1 ) check( ClassType = 'A' ),
    ...,
    constraint FK_Assets_AssetClass foreign key( ID, ClassType )
        references AssetClasses( ID, Type )
);
create table AssetGroups(
    ID         int not null primary key,
    ClassType  char( 1 ) check( ClassType = 'G' ),
    ...,
    constraint FK_AssetGroups_AssetClass foreign key( ID, ClassType )
        references AssetClasses( ID, Type )
);

AssetGroups和Assets之间会有一个多对多的交集表,允许许多组和一个组访问资产以访问许多资产。在Users和AssetClasses之间也会有一个交集表,因此您可以将资产(直接到资产或通过AssetGroup间接)共享给用户。

这可能看起来很复杂,而且它有点,但它会为您提供所需的一切。它很容易扩展 - 我很快意识到资产的所有者将不得不部分资产数据。由于所有者将同时应用于资产和资产组,因此它将进入AssetClasses表:

    OwnerID    int not null,
    constraint FK_AssetClass_Owner foreign key( OwnerID )
        references Users( ID )

任何仅适用于资产或仅适用于资产组的属性都将包含在相应的子表中。