2009-08-21 18 views
3

私は多くのオブジェクトを持っていますが、それぞれ異なる種類の属性を持つことができます。多くの属性が重複しています。たとえば、多くのオブジェクトには属性「名前」があります。 オブジェクトの種類が多いため、同じ属性セットのオブジェクトセットごとにテーブルが構築されていると、多くのテーブルが必要になります。データベースにオブジェクトを格納

現在、私はmysqlを使用しており、この方法で保存されています。

object_id|attribute_id|data 

このようなテーブルがいくつかありますが、それぞれ異なるテーブルには異なるデータタイプがあります。 たとえば、Integerテーブルでは、整数のみを格納します。

したがって、すべての種類のオブジェクトをシステムに格納できます。属性のデータに従ってフィルタリングと並べ替えを実行することもできます。それはクエリを少し複雑にし、効率的だとは思わない。

これはmysqlや他のリレーショナルデータベースで行う方法ですか? この問題の他のデータベースモデルを探すべきですか?私はいくつかの研究をした

EDIT 、私がSQLのパワーとドキュメント指向データベースである必要があるものと思われます。

答えて

5

あなたはRDBMS様ドキュメント指向データベースと一緒に行きたい場合は、私はあなたがmongoDBになるはずだと思う:

のMongoDBの重要な目標は、(キー/値ストア間 のギャップを埋めることです は高速でスケーラビリティが高い)、 従来のRDBMSシステム(機能は深い。 )である。

+0

MongoDBのもう一つの利点は、あなたの状況に直接当てはまると聞こえますが、1つのコレクション(MySQLのテーブルに似ています)で類似しているが同一ではないオブジェクトのすべてを持つことができるということです。 Doctrineのような良いORMを使用すると、データベースからオブジェクトをロードする際に、オブジェクトのタイプを自動的に区別し、PHPの正しいオブジェクトに変換することさえできます。あなたが使用している言語はわかりませんが、PHPでなければ似たようなものがあるはずです。 – cjroth

5

あなたがしたいことは、「オブジェクトリレーショナルマッピング」と呼ばれる領域を研究することだと思います。多くのソリューションを備えた大きな領域です。いくつかは、Railsで使われるActiveRecordのようなフレームワークで使われます。

0

テーブルを1つ使用することは可能であり、おそらく好ましいものです。すべてのオブジェクト型の各属性の表の列があります。次に、もう1つの列を追加して、「オブジェクトタイプ」を示します。特定のオブジェクト・タイプ名を持つ行を単純な照会で表から1つのタイプのすべてのオブジェクトを取得できます。

+0

スペースが問題ではなく、わずかな属性しかない場合に機能します。 ここでスペースは問題ではありませんが、多くの属性(潜在的に何百ものもの)があります。 mysqlのようなデータベースは、行がどれくらい格納できるかに制限があり、それを不可能にします。 –

0

ORMを使用する代わりに(非常に良いアイデアです)、代わりに、オブジェクトをバイトバッファに変換するために言語の組み込みシリアル化機能(ライブラリがあればそれ以外の場合はライブラリ)それを検索するのに適したキーでデータベースに格納します。これはmemcachedなどのキーバリューデータベースでうまく機能します。

+0

これは良いアイデアです。リレーショナルデータベースの本当のメリットはありません。フィルタリングや並べ替えが必要ない場合は、これがベストプラクティスであることは明らかです(実際、東京キャビネットのようなキー/バリューデータベースが十分です)。しかし、属性xが10より大きいすべてのオブジェクトを見つけるようなニーズがあります。この設計では、すべてのオブジェクトをメモリに読み込み、そのようなオブジェクトをフィルタリングする必要があります。 –

4

デザインはオブジェクト属性値(OAV)と呼ばれます。オブジェクトをリレーショナルデータベースにマップする方法の1つです。一般的に非常に遅いですが、非常に柔軟です。クラス定義が絶えず変更されている(または動的に変更されている)場合は、これが唯一の選択肢かもしれません。

オブジェクト・リレーショナル・マッピング(ORM)を使用できます。これは、オブジェクトをリレーショナルデータベースにする別の方法です。はるかに速く、柔軟性はやや劣ります。クラス定義が頻繁に変更されない場合(そして動的に変更されない場合)、これははるかに優れた選択肢です。

関連する問題