由于问题的性质,搜索类似的问题或文章非常困难,因为关键词具有广泛的含义。所以,如果有类似的问题,请原谅我。
问题。 (简化的)
我有一个用户表。(表用户)
每个用户都拥有自己的资产 (表资产用户ID的外键)
2用户可以是合作者。每个用户选择他想要与另一个共享的资产。为了在此合作中使用,创建了包含user1和user2资产的共享组。 (表组FK CooperationId)(组表中的联接表资产)(表UserCooperation) < / p>
现在是棘手的部分。
在某些情况下,用户可能希望与用户共享其资产的全部。为了避免每次手动添加新资产,我们都需要一个解决方案。
可能的方法。(按个人喜好排序,考虑到排队等候的表现)。
替代结构。
每个用户都有自己的团队并加入与他的团队的合作,而不是拥有合作的共享团队。 (虽然如果没有合作,一个团体没有任何意义,并且All In Group问题保持不变。)
答案 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 )
任何仅适用于资产或仅适用于资产组的属性都将包含在相应的子表中。