5

通常、データベースでテーブルを作成/変更するには、移行 (手動で実行rake db:migrate) を使用し、コードで ActiveRecord を使用します。これは、db 内のデータの表現や、特定の種類の db (sqlserver、pg など) について心配する必要がないため、非常に優れています。

しかし今、顧客は、たとえばコンピューターの販売を開始するなど、その場で「もの」を自分で作成できるようにしたいと考えているため、「名前、RAM、 HD、...」。これらすべてのフィールドを含む別のテーブルを db に作成するのはごく自然なことのようです。しかし、RoR でそれを行い、ActiveRecord の優れた点をすべて保持するにはどうすればよいでしょうか?

提案してください。

4

2 に答える 2

2

通常の方法は、正反対のことをすることです:

  • オブジェクト タイプのテーブルを用意する
  • 各オブジェクト タイプのフィールド名のテーブルを用意する
  • 任意のタイプの各オブジェクトのすべてのカスタム属性を含む非常に大きなテーブルを用意する

これは EAV (エンティティ属性値モデル、http://en.wikipedia.org/wiki/Entity-attribute-value_modelを参照) と呼ばれます。そして、それはかなり悪いスケールです。

store別の方法として、大きな EAV テーブルの代わりにテキスト列を使用することもできます ( http://api.rubyonrails.org/classes/ActiveRecord/Store.htmlを参照)。これにより、EAV に典型的な難しい属性検索を行う必要がなくなります。 . 「オブジェクトタイプ」の定義をどこかに保存する必要があるため、フォームやテーブルを作成するときに予想されるフィールドなどを利用できます。

このアプローチの問題は、これらの属性が列ではないため、これらの属性に対してクエリ (where/join/select) を実行できないことです。それにはいくつかの解決策があります。

  • これらの属性でフィルタリングを行わないでください (まあ...)
  • ファセット検索を実行できる外部検索サーバーを用意する
  • (@Amar が正しく言っているように) ドキュメント データベースを使用する
  • postgreSQL を使用hstoreし、単純なシリアル化された列の代わりに使用します。
于 2012-11-06T09:28:35.373 に答える
1

NoSQLデータベース(ドキュメントデータベースMongodb、CouchDB)は、これに最適であるか、redisを使用できます。私の考えによると、垂直テーブルの概念を使用できます。MySQL用のアプリケーションのRails2.xデモを実行してみてください。Mongodbを試して、これが必要かどうかを確認できます。

于 2012-11-06T09:07:39.573 に答える