0

ユーザーがたとえばtoolsデータベースを定義し、ブランド、年などのアイテムを格納するフィールドを作成する Rails 4 アプリケーションがあります。次に、定義したフィールドに基づいて、CRUD インターフェイスがユーザーの前に表示されます。

現在、次のようなデータベース モデルがあります。

class Database < ActiveRecord::Base

  has_many :fields

そして、次のようなフィールド モデル:

class Field < ActiveRecord::Base
  belongs_to :database

基本的に、現在 [フィールドの追加] ページ (データベースを作成してフィールドを定義した後) で、一意の ID を作成し、そのページのすべてのフィールドと共にそれを保存しています。これを使用してフィールドをグループ化します。 「行」に(レールのgroupbyステートメントを使用して)。

2 つの質問があります。1. 「データベース」を実装する最も効率的な方法はありますか? 2. データベースを作成するときに定義したフィールド名と、CRUD インターフェイスのフィールドを関連付ける最適な方法がわかりません。たとえば、name最初にすべてのフィールドを定義するときにフィールドを作成した場合、CRUD インターフェースのフィールドに関連付けるにはどうすればよいでしょうか?

助けてくれてありがとう!さらに明確にする必要がある場合は、教えてください。

4

4 に答える 4

1

最終的な目標が何であるかはよくわかりませんが、フィールド モデルに名前、型、値、およびユーザーを持たせることができます。これは、ユーザー モデルとの関係です。明らかに、1 人のユーザーには多くのフィールドがあります。

たとえば、ユーザー Bob が「商品名」と「商品価格」というフィールドを作成したとします。彼の UI には、「製品名」と「製品価格」のテキスト ボックスがあります。価格ボックスには、タイプが数値であることがわかっているため、それに関連付けられた「少ない、多い、等しい」というドロップダウンがある場合があります。したがって、クエリは基本的に疑似SQLで「名前が「製品名」で値が製品名テキストボックスで指定された名前である(または同様の)名前であり、名前が「製品価格」で値であるユーザーボブのすべてのフィールドを選択します(<|=|>) は、[製品価格] テキスト ボックスに指定された値です (数値に解析した後)。

多分。

他のすべてが失敗した場合は、見たいようにコードを書くことを検討してください。コードからデータベース構造に移動することは、典型的な逆ではなく、非常に役立ちます。

それが役立つことを願っています。

于 2013-10-06T16:30:52.193 に答える
1

あなたのビジネスモデルはわかりませんが、まったく新しいデータベースを作成することがあなたの目的かどうかはわかりません。これには、キー/バリュー ストアが必要なようです。postgres には hstore があります。

各行がデータベースを表し、hstore には任意の各フィールドを表すキー/値のリストが含まれるデータベース テーブルで postgres hstore を使用します。

于 2013-09-29T02:04:59.763 に答える
0

何らかの理由で、DBオブジェクトのクラス図を添付できませんが、テーブル構造の下からそのアイデアを取得しようとしています。

エンド ユーザーの観点からは、UI のフィールド名のリストを確認します。そして、それらのいくつかを UI の特定の場所に引っ張って、それらが一緒であることを示します。これにより、新しいDBが形成されます。別の見方をすれば、それはテーブルに他なりません。私は、テーブル定義を読み取って C# コードを使用して CRUD を動的に生成しようとするプロジェクトに取り組みました。下の図を見ると、疑問が解消されるかもしれません。基本的に、いくつかのメタデータ テーブルを格納する必要があり、コードはそれを使用して CRUD を作成できます。以下は、開始できるサンプル DB オブジェクトです。必要とする複雑で洗練されたデザインに応じて、さらに機能を追加できます。

    DECLARE @_DBField TABLE
    (
        ID      INT IDENTITY NOT NULL
        ,NAME   sysname NOT NULL
    )
    DECLARE @_FieldDataTypeID TABLE
    (
        DataTypeID      INT IDENTITY NOT NULL
        ,SqlDataType    sysname NOT NULL
        ,DisplayName    sysname NOT NULL
    )
    DECLARE @_DB TABLE
    (
        ID          INT NOT NULL
        ,DBName     sysname NOT NULL
        ,FieldID    INT NOT NULL
        ,DataTypeID INT NOT NULL
        ,IsPartofPK BIT NOT NULL DEFAULT 0
    )

    INSERT INTO @_DBField( NAME )   
    SELECT 'FName' 
    UNION ALL   SELECT 'LName' 
    UNION ALL   SELECT 'MName'

    INSERT INTO @_FieldDataTypeID( SqlDataType ,DisplayName)
                SELECT 'NVARCHAR(50)'       ,'Short-String; Alphanumeric value'
    UNION ALL   SELECT 'NVARCHAR(200)'      ,'Midium-String; Alphanumeric value'
    UNION ALL   SELECT 'NVARCHAR(500)'      ,'Long-String; Alphanumeric value'
    UNION ALL   SELECT 'NVARCHAR(MAX)'      ,'Max-String; Alphanumeric value'
    UNION ALL   SELECT 'INT'                ,'Small-Integer; Integer Value'
    UNION ALL   SELECT 'BIT'                ,'0 or 1; Boolean Value'


    INSERT INTO @_DB( ID ,DBName ,FieldID ,DataTypeID ,IsPartofPK )
                SELECT 1,'Student_Name',1,1,1
    UNION ALL   SELECT 1,'Student_Name',2,1,1
    UNION ALL   SELECT 1,'Student_Name',3,1,0

    SELECT * FROM @_DB
于 2013-10-02T19:23:32.363 に答える