13

私たちは皆そこにいます - 次の例を考えてみてください - 最初に、クライアントは「すべてのユーザーは 1 つのプロフィール写真しか持たない」と言うので、そのフィールドを users テーブルに追加します - 半年後、要件が変更され、ユーザーn 個のプロフィール写真が必要です。

現在、これは、user_pictures などの新しいテーブルを追加して、1:1 ではなく 1:n の新しいカーディナリティを処理する場合にのみ可能と思われます。多くの場合、これは非常に複雑になります。この問題に出くわすたびに、考えることができる 3 つの次元すべてを使用しないのはなぜだろうと思います。繰り返しになりますが、 users テーブルの picture フィールドにはdepthがあり、その深さにより、フィールドは 1:1 と 1:n の両方のカーディナリティを同時に完全に表す配列になりました。

テーブル フィールドは単純に配列になり、両方のカーディナリティを自動的にサポートします。少なくとも私はそれを使用します。すでにそのようなものはありますか?

4

3 に答える 3

9

Oracle は、ネストしたテーブルだけでなく、配列もサポートしています。どちらもあなたの要件に合っているようです。最近では、物事をシンプルかつ一貫したものにするために、すべてをテーブルとリレーションシップとしてモデル化することを好むため、最新の RDBMS は一般にこのようなものをサポートしておらず、標準 SQL に組み込まれたこともないと思います。

于 2012-12-14T23:55:08.397 に答える
7

標準的な多対多のアプローチ (多数のユーザーから多数のプロフィール写真) は、3 つのテーブル アプローチで簡単にカバーできます。

表: ユーザー
表: 写真
表: User_Pictures

ただし、NoSQL アプローチに移行する場合は、そのユーザーのプロフィール写真の配列を単一のテーブルに格納するユーザー ドキュメントを (通常は JSON 形式で) 格納できます。

Oracleリンクの@gordy +1。RDBSが配列を想定しているかどうかはわかりませんでした。

于 2012-12-14T23:56:57.863 に答える
3

あなたは非正規化手法 (1 つのフィールドのインスタンスに対して複数の列) を説明していますが、基本的なリレーショナル原則に違反した場合の結果を完全に理解していない限り、通常は涙が出ます。

フィールドに対してクエリを実行する (「この画像を持っているユーザーを見つける」) ときに、「AND 画像 IN (pic1, pic2, pic3)」を含む SQL ステートメントをインデックスに登録できず、オプティマイザーはその復讐の計画を開始します。

于 2012-12-15T00:03:24.720 に答える