有人能帮我吗:如何在社交媒体中制作具有可见选项的相册表--公共的、私有的和特定的朋友/People?如何制作相册中的关系表和可以在相册中看到的特定朋友的列表?
谢谢你
发布于 2016-10-06 15:45:29
您需要一个表来解决许多人与相册之间的关系。这个表将有一个对PersonID和AlbumID的外键引用,可能还有一个布尔值“IsVisible”。
发布于 2016-10-07 00:28:56
首先,您需要以一种很容易(或尽可能容易)转换为模式的方式编写规范。例如:
“此系统由用户和相册组成。相册由一个用户创建并拥有。拥有相册的用户可以完全访问该相册,但所有其他用户要么被拒绝对相册的所有访问(默认值),要么在拥有用户的许可下被允许对相册进行读取访问。”
规范中有两个名词(用户,相册),因此有两个实体:用户和专辑。
create table Users(
ID int auto_generating primary key,
... ... -- other user data
);
create table Albums(
ID int auto_generating primary key,
... ... -- other album data
);有两个重要的动词(拥有,访问)。这些描述了实体之间的关系。由于只有一个所有者,所以最简单的方法是从相册创建一个外键给拥有的用户。
create table Albums(
ID int auto_generating primary key,
OwnerID int not null references Users( ID ),
... ... -- other album data
);使用相交表允许访问相册非常简单。
create table AlbumAccess(
AlbumID int not null references Albums( ID ),
UserID int not null references Users( ID )
);此表可以有其他属性来描述这种关系,例如授予访问的日期,或者,如果您希望允许临时访问,则使用"GoodUntil“日期。如果你需要的话,你可以变得很有创造力。
立即想到的一个改进是,如果用户有一长串他们想要授予访问权限的其他用户,或者几个这样的列表。每次这些用户创建新专辑时,通过并授予他们访问权限会很快变得单调乏味。所以您可以创建包含用户列表的用户列表。然后,可以将访问权限授予列表中的每个用户。
每个用户都可以创建他们自己的列表,并给他们命名任何他们想要的:“家庭”,"Fall2017EnglishClass",“付费订阅者”等等。
这给我们提供了系统中的另一个实体,从而给出了另一个表:
create table Lists(
ID int auto_generating primary key,
Name varchar( 32 ) not null,
OwnerID int not null references Users
);好吧,但现在我们又制造了另一个问题?(不!这从来没有发生过!)交集表包含给用户的FK,而不是列表。我们可以创建另一个相交表,将相册和列表绑定在一起,但这里有另一个可能的解决方案。
假设当我们创建一个新用户时,我们还在幕后创建了一个仅由该用户组成的列表。当用户被授予对相册的访问权限时,它实际上被赋予了这个列表别名。那么所有的访问都将通过列表。
因此,我们需要维护每个列表中的用户。
create table ListMembers(
ListID int not null references Lists( ID ),
MemberID int not null references Users( ID ),
constraint PK_ListMembers primary key( ListID, MemberID )
);因此,UserID表的AlbumAccess字段将更改为ListID,并将引用List表。
这都是裤子的设计,我还没画出来呢。所以我很可能错过了一些重要的事情。但它应该足够近,你可以处理任何松散的末端。如果没有,那就问吧。
https://stackoverflow.com/questions/39893859
复制相似问题