2011-07-23 22 views
0

Webフォームを使用して製品のユーザーからデータを収集するためのRuby On Rails Appを開発しています。データベーステーブルにはすべてのProductTypesが含まれ、別のテーブルにはProductAttributesが含まれ、ProductTypes_ProductAttributesには特定の製品タイプに割り当てられた属性をマッピングする関係テーブルがあります。特定の製品ごとに収集されたデータは、Productsテーブルに格納されます(各属性の列/フィールドがあります。その属性が製品に関連していない場合は空白になることがあります)。Ruby On Rails Webアプリケーションの動的フィールド

管理者ユーザーが新しいProductAttributesをシステムに追加し、特定のProductTypesに割り当てる機能を追加したいとします。収集された特定の製品を持続させることを除いて問題はありません。これにより、実行時にProductsテーブルに新しい属性フィールドを動的に追加する必要があります。これは、私がこれを行うための最善の方法としてちょっと困っているところです...

1)製品をXML文書に保存します。これは、DBに空のフィールドがたくさんあることをその製品のProductTypeに属さないため、新しい属性タイプを問題なく保存できます。私はXMLファイルにデータを格納するのに少し疲れていますが、私はいつもそれらをデータを送信したり移動したり、格納したりする手段ではないと考えてきました。

2)伝統的なフィールドは、商品コードのまま、RDBMSを使用し続けるが、XML内の製品のために動的であることができる属性を格納するためのBLOBフィールドを含む、説明などなど

3)最後に、上記のRDBMSソリューションがありますか?私はMongoDBについていくつかの議論を見たことがありますが、私はそれがより伝統的なDBの背景を持っていることに本当に慣れていないことを認めます。

これについての経験やヒントがありましたら、ぜひお聞かせください。私は、Ruby on Railsと統合され、フィールドがDBテーブルに追加されたときにコード変更を必要とせずに永続フィールドを動的に追加できるようにしたいのですか?

乾杯、

答えて

2

スティーブこのタイプの問題は、電子商取引アプリケーションのために、実際には非常に一般的です。製品は異なる製品タイプに属し、動的でユーザー定義の属性が必要です。

まず、オープンソースのいくつかのRails電子商取引プラットフォームを見てみましょう。ホイールを再発明するのではなく、それらを結びつける方が簡単かもしれません。あなたの質問について

、しかし、あなたはproduct_typesとproduct_attributesのための別々のテーブルを作成すると右のトラックにすでにあるように見える:私は、現時点で最も人気があると思います次にそれらを結合するテーブル。

現在のデータベース設計を変更できるかどうかは不明ですが、そうした場合は、新しいフィールドを製品表に動的に追加することについて心配する必要はありません。

あなたがやりたいことは、わずかに異なるデータベース設計で達成できると思います。

create_table "products" do |t| 
    t.string "name" 
    t.integer "product_type_id" 
    # ... other fields 
end 

create_table "product_types" do |t| 
    t.string "name" 
    # ... other fields 
end 

create_table "product_attributes" do |t| 
    t.string "name" 
    # ... other fields 
end 

create_table "product_attributes_product_types" do |t| 
    t.integer "product_attribute_id" 
    t.integer "product_type_id" 
end 

create_table "product_product_attributes" do |t| 
    t.integer "product_id" 
    t.integer "product_attribute_id" 
    t.string "value" 
end 

だからではなく、実際の製品のためのデータを保持しproductsテーブル、あなたは別のproduct_product_attributesテーブルにデータを格納することができますので、これはあなたのスキーマは次のようになりことができるものです。

管理者が各製品のフォームに記入すると、まず、その製品が属する適切な製品タイプを選択します。製品タイプが設定されると、その製品タイプに関連付けられている属性のみが管理フォームに表示されます。異なる製品タイプに製品属性を割り当てることは、別々の管理タスクです。

これが役に立ちます。

〜アンドレア

関連する問題