多対多の関係が存在できるようにする中間結合テーブルを探しているようです。テーブル スキーマについては、次のようなものをお勧めします。
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 に挿入されます。
これは確かに現時点ではやり過ぎのように思えるかもしれませんが、将来のある時点で機能を追加することに決めたとしても、後悔することはありません。他の本と同じ種類の活動。適切に設計されたデータベースは、ソフトウェアに新しいものを簡単に追加できるようにする必要があります。ハッピーコーディング。