听起来您正在寻找一个允许存在多对多关系的中间连接表。我可能会建议这样的表模式:
CREATE TABLE User
(
UniqueID uniqueidentifier NOT NULL Primary Key default newid(),
FirstName nvarchar(100) NOT NULL,
etc..
)
CREATE TABLE Book
(
UniqueID uniqueidentifier NOT NULL Primary Key default newid(),
Title nvarchar(100) NOT NULL,
etc..
)
CREATE TABLE Activity
(
UniqueID uniqueidentifier NOT NULL Primary Key default newid(),
Description nvarchar(100) NOT NULL,
etc...
)
CREATE TABLE UserActivity
(
UserID uniqueidentifier NOT NULL,
BookID uniqueidentifier NOT NULL,
ActivityID uniqueidentifier NOT NULL,
CONSTRAINT PK_UserActivity PRIMARY KEY CLUSTERED
(
UserID ASC,
BookID ASC,
ActivityID ASC
)
)
这样,许多用户可以对许多书籍进行许多活动。数据库设计的最佳实践建议不要使用 FirstName 作为主键,因为许多人可能有相同的名字。你会想要一些更独特的东西,比如 int 字段或 uniqueidentifier。
Book 和 Activity 是相似的——它们存储不同的书籍(“Book 1”、“Book 2”)和可以执行的不同类型的活动(“Completes Activity 1”、“Completes Activity 2”)。
每次用户完成一本书的活动时,都会将一条记录插入到 UserActivity 中,该记录描述了用户、书籍和执行的活动。
尽管这在这一点上看起来确实有点过头了,但如果您决定在以后的某个时候添加功能,您不会后悔的——比如添加一种新类型的活动,或者一本没有所有功能的新书。与其他书籍相同类型的活动。一个设计良好的数据库应该可以很容易地为您的软件添加新内容。快乐编码。