1

これは非常に一般的な設計上の問題であると思うので、私の質問はばかげているかもしれません。それには、単純で通常の解決策があると思います。

  • 私はテーブルプロデューサーとテーブルムービーを持っています
  • 1人のプロデューサーが多くの映画を制作しました
  • 1人のプロデューサーが彼が制作したものの中で1つのお気に入りの映画を持っています

これをMySQLに実装するにはどうすればよいですか?

  1. プロデューサーと映画の間の1対多の関係に加えて、映画テーブルの「お気に入り」のブール属性
  2. 「生成された」関係を表す1対多の関係と「お気に入り」の関係を表す1対1の関係

最初の解決策は私にはもっと自然に思えますが、プロデューサーがお気に入りの映画を変更したい場合は、2番目の解決策の方が効率的だと思います。また、ソリューション#2を使用して、プロデューサーのお気に入りの映画を見つける方が効率的です。

私は何が欠けていますか?最善の解決策はありますか?そうでない場合は、ソリューション#1とソリューション#2を使用する必要がありますか?

(もちろん、私の問題は上記の例よりも少し複雑です...)

4

6 に答える 6

1

一般に、ソリューション2を使用します。お気に入りのクエリを簡単にするだけでなく、組み込みの制約という追加の利点があり、ユーザーはお気に入りの映画を1つだけ持つことができます。さらに、これはわずかに小さくなり、視聴した映画ユーザーごとに1つのブール値ではなく、ユーザーごとに1つのIDがあります。ただし、副作用の1つは、映画を見なくてもお気に入りに追加できることです。

解決策1は、将来、お気に入りシステムを拡張して複数のお気に入りを含める場合にのみ推奨される選択肢です。ただし、これは明らかに望ましくないように思われます。


また、ユーザーと映画の関係は、各ユーザーが独自の視聴済み映画のリストを持っているため、1対多ではなく、多対多であることに言及する価値があります。したがって、2つをリンクするには3番目のテーブルが必要になります。もちろん、ユーザーごとに相関のない文字列のリストがある場合を除いて、これが当てはまるとは思えません。

于 2012-11-05T15:28:57.507 に答える
1

boolean属性は、より多くのスペースを占めるだけでなく、複数のユーザーがお気に入りを持つことを妨げるように見えます。

2番目の解決策は正しいように聞こえます。ユーザーに各ユーザーのお気に入りを表すフィールドと、1対多の「視聴した」関係を作成するための追加のテーブルを用意します。

ユーザーが実際にお気に入りの映画を視聴したことを確認する必要がある場合は、そのロジックをビジネスルールとしてデータアクセスオブジェクトに追加する必要があります。

于 2012-11-05T15:25:27.300 に答える
1

(1)は、宣言的に実施するのは簡単/効率的ではありません。さらに、お気に入りではないすべての映画のスペースを無駄にすることになります。

(2)は行く方法です。残念ながら、この循環依存は鶏が先か卵が先かという問題を引き起こし、解決されます。

  • FKの1つを延期することによって(DBMSがそれをサポートしている場合、残念ながらMySQLはサポートしていません)、
  • または、FKをユーザーにNULL可能のままにしておくこともできます。これは、ユーザーがお気に入りの映画を0本または1本(厳密には1本ではなく)持つことができるため、理想的とは言えません。

同じ映画を複数のユーザーに関連付けたいと仮定すると(あなたが述べたように1対多ではなく、多対多の関係にする)、モデルは、延期可能なFKをサポートするDBMSでは次のようになります。 :

ここに画像の説明を入力してください

ただし、MySQLで制約を延期する余裕がないため、次のようなことを強いられます。

ここに画像の説明を入力してください

CHECK (FAVORITE_USER_ID IS NULL OR FAVORITE_USER_ID = USER_ID)
于 2012-11-05T20:20:59.850 に答える
0

常に1つの映画しか存在しないことが確実な場合は、ユーザーテーブルに「お気に入りの映画ID」属性と、ユーザーと映画の間の多対多の関係があります(同じ映画を多くのユーザーが視聴できます)。

したがって、合計3つのテーブルが、usersテーブルにフラグを立てます。

于 2012-11-05T15:22:51.443 に答える
0

2番目の解決策がより実現可能だと思います。これらのリレーション用に2つのテーブルを作成できます。1つはHasWatchedという名前で、もう1つはFavoriteという名前です。これらのテーブルは両方とも、userId--movieIdという名前の2つの列で構成されています。Haswatchedテーブルの主キーは(userId --movieId)タプルです。ただし、Favoriteテーブルの主キーはuserIdのみです。したがって、すべての制約を適用できます。

于 2012-11-05T15:24:40.057 に答える
0

私は3番目のテーブルを作成します...私は1対多の関係ではないと思います、その多対多、1人のユーザーは多くの映画を見ることができますが、1つの映画は多くのユーザーが見ることができます...

user_id、movie_idを使用して、usersテーブル、movieテーブル、およびuser-movie-watchedテーブルを作成し、ユーザーのお気に入りのmovie_idを指すfavorite_movieフィールドを追加します。

于 2012-11-05T15:27:11.067 に答える