2つのテーブルがあります。「ユーザー」と「映画」。ユーザーテーブルは、「id」(自動インクリメント)、「name」、「password」の列で構成されています。現在、2つのユーザー名が保存されています。映画の表には、「タイトル」列と「年」列があります。PHPスクリプトを使用すると、各ユーザーは新しい映画を視聴してリストに追加できます。親子関係またはMySQLでそれを実現するために必要なものをリンクまたは作成するにはどうすればよいですか?ああ、私もAdminerを使用しています。現在、1人のユーザーにログインすると、他のユーザーと一緒に追加したのと同じ映画が表示されます。
2 に答える
コメントに記載されているように2つのテーブルだけを使用することに固執している場合は、Moviesテーブルを再設計して、そのエントリを作成したユーザーを識別する列UserIDを含める必要があります。次に、データをフィルタリングして、ユーザーがリストに追加した映画に関する情報のみを表示できるようにします。
これは良いデザインではありません。映画をユーザーに関連付けるための追加のテーブルを提案するJeremySmythの回答ははるかに賢明ですが、それは許可されていないことを示しています。良いデザインではない理由は、同じ映画が同じ年にリリースされ、各行が異なるユーザーによって入力されたことを示す行がたくさんあることになり、不必要な繰り返しが発生するためです。エラーが発生する可能性も高くなります。「風と共に去りぬ」1938年、「風と共に去りぬ」1939年、「風と共に去りぬ」1940年のエントリを取得します。
私がしなければならないことについてもっと具体的に教えてください...
2つのテーブルのみのシステムでは、次のようにMoviesテーブルを作成します。
CREATE TABLE Movies
(
Title VARCHAR(32) NOT NULL,
Year INTEGER NOT NULL,
UserID INTEGER NOT NULL REFERENCES Users(ID),
PRIMARY KEY(Title, Year, UserID)
);
このテーブルにレコードを挿入するときは、挿入を行ったユーザーのIDを記録するため、誰がどの映画のレコードを作成したかを照会できます。
データベースの他の場所から実際にこのテーブルを参照する場合は、ここにID列を追加することもできますが、さらにテーブルがある場合は、このテーブルからUserID列を削除して、リレーションシップテーブルを作成します。
CREATE TABLE Movies
(
ID INTEGER AUTOINCREMENT PRIMARY KEY,
Title VARCHAR(32) NOT NULL,
Year INTEGER NOT NULL,
UNIQUE(Title, Year)
);
CREATE TABLE Users_Movies
(
MovieID INTEGER NOT NULL REFERENCES Movies(ID),
UserID INTEGER NOT NULL REFERENCES Users(ID),
PRIMARY KEY(MovieID, UserID)
);
これで、「風と共に去りぬ」1939のレコードを1つ作成できます。これは、ID番号207である可能性があり、20人の異なる人々がMovieID 207を、Users_Moviesテーブルに20の単純なレコードを持つ映画の1つとしてリストする可能性があります。
2つのテーブル間に「多対多」の関係を作成する必要があります。
これをする:
- まず、テーブルに
ID
列を作成して、Movies
それぞれを一意に識別します user_movies
次に、ユーザーID、映画ID、および視聴日や評価(「スター」の数)などの追加したいその他の情報を含む、(または「視聴済み」または何か便利な)という別のテーブルを作成します。
次に、ユーザーが映画を見るときはいつでも、user_movies
テーブルにレコードを追加して、それを行ったことをマークします。
各ユーザーは複数の映画を見ることができますが、各映画は複数のユーザーが見ることができるため、多対多である必要があります。この場合、「親子」関係は適切ではなく、1対多の関係になります。