2012-12-14 18 views
7

次の例を考えてみましょう - クライアントは「すべてのユーザーは1つのプロフィール画像しか持たない」と言うので、そのフィールドをusersテーブルに追加します。半年後要件が変化し、ユーザは実際にはn個のプロフィール画像を有する必要がある。3次元データベーステーブル

これは、user_picturesのような新しいテーブルを追加して1:1ではなく新しいカーディナリティー1:nを処理する場合にのみ可能です。しばしば、これは非常に複雑になることがあります。私がこの問題に遭遇するときはいつも、私たちが考えることができる3つの次元をすべて使用しないのだろうかと思っています。2次元のテーブルは、幾分不完全なやり方で制限されています。再び、ユーザーテーブル内のピクチャフィールドはの深さがであり、その深さによって、フィールドは同時にカーディナリティ1:1と1:nの両方を完全に表現する配列になりました。

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

+0

データベース(「1対1」、「1対多」、「多対多」)における「物」間のすべての可能な関係がカバーされます。 「三次元」テーブルのユースケースは何ですか?それは何を意味していますか? – NullUserException

+0

このユースケースの例は、上記のプロファイル画像です:新しいテーブルを追加する必要がありますが、それは明らかに面倒です。モデルの関係を変更する必要があり、それに応じて更新されるなど - 多くの苦労と作業が必要です。私たちはそれよりもうまくいくと思います。二次元のフィールドではなく、テーブルを三次元にして解決しますか? – weltschmerz

+1

リレーショナルデータベースは非常にしっかりした基礎 - リレーショナル代数(http://en.wikipedia.org/wiki/Relational_algebra)によってサポートされています。彼らは迅速かつ正確であることを保証します。これは、他の種類のデータベースが何年も訪れてきたときに、まだ彼らがまだ周辺にいる理由の1つです。壊れていないものを修正しないでください。 – NullUserException

答えて

7

オラクルでは、arraysおよびnested tablesがサポートされています。いずれかあなたの要件に合わせているようです。最近では、テーブルや関係をすべてシンプルで一貫性のあるものにするためにモデリングすることを好みますが、現代のRDBMSは一般的にこのようなことをサポートしていません。

+0

偉大な答え、リンクありがとう! – weltschmerz

4

標準の多対多のアプローチは、多くのプロフィール画像に、簡単に3台のアプローチで覆われている多くのユーザー:

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

しかし、NoSQLのアプローチに移行した場合、ユーザーのプロファイル・ピクチャーの配列を単一の表に保管するUser文書(通常はJSON形式)を保管することができます。

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

2

非正規化手法(1つのフィールドのインスタンスの複数の列)について説明していますが、基本的な関係原則に違反した場合の結果を十分に理解していないと、

"AND picture IN(pic1、pic2、pic3)"というSQLステートメントでフィールドを照会する(「この画像を持つユーザーを見つける」)索引付けされ、オプティマイザが復讐の計画を開始します。

+0

+1のインデックス作成について – weltschmerz