1

私は自分のシステムの特定の機能の設計を理解しようとしています(これはクラウドベースのサービスの一部です)

基本的に、ユーザーがシステムと統合された単純なCRMエントリ/取得システム用の独自の疑似「テーブル」を作成できるようにしたいと思います。

だから私は私が助けを必要としている2つの質問があります

  1. データをどのように保存するのか疑問に思っています。2つのレイアウトを考えました。

    • たとえば、テキスト整数、または 倍精度のいずれかを格納する3つのテーブルを作成します

    cms_item_text-[id, heaqderID, data (text)]

    cms_item_int-[id, headerID, data (int)]

    cms_item_double-[id, headerID, data (double)]

    • またはcms_item-[id, headerID, data (text)]そして私は(MySQLのcast()関数を使用して、orderを実行するときにテキストからinteger / doubleに変換します(例order by cast(data as signed integer)))
  2. 現在、データの取得は別の話です。それはしばしばテーブルビューにあるので、それから読むための最良の方法は何ですか?私はそれをこのように考えました-

    SELECT barcode.data as barcode, price.data as price, notes.data as notes
    FROM cms_item barcode, cms_item price, cms_item notes
    WHERE (barcode.headerID = 1 and barcode.id = 1) and
          (price.id = 1 and price.headerID = 2) and
          (notes.id = 1 and notes.headerID = 3)
    

次のような結果が得られるように

array("barcode" => "eg", "price" => "123", "notes" => "hello there")
array("barcode" => "no2", "price" => "456", "notes" => "yes")

取るべき最良の設計パスは何ですか?

4

1 に答える 1

1

アプリケーションの設計でも同様の問題に直面しました。基本的に、データ型の指定を含め、ユーザーがデータベース内の「テーブル」を定義できるようにする必要がありました。

私は最終的に最初のアプローチを採用しました。それにより、ユーザーが定義できる複数のフィールドとさまざまなタイプを持つ単一のテーブルができました。

私は最終的にそれをすべて機能させましたが、それはスムーズな航海ではありませんでした。クエリは非常に複雑になり、アプリケーション内からSQLクエリを作成することと組み合わせてDynamicSQLを非常に多く使用する必要がありました。

私にとってのキッカーと、(すべてをテキストフィールドに格納するのではなく)アプリケーションに強く型付けされたデータフィールドを実装することを選択した理由は、数値データ型に対してSQL関数(、など)AVGを実行する機能でした。MAXMIN

つまり、どちらの方法を選択しても、実装とコーディングが簡単なものと難しいものがあります。データを引き出し、SQL関数またはコードのいずれかを使用してデータをキャストする場合は、アプリケーションのサイズに応じて、データの保存と取得の両方で不要な検証チェックが多数行われる可能性があります。

ユーザーがDB内のデータに必要とする機能について、実際に検討することをお勧めします。これは、徹底的に調査する必要がある決定であり、アプリケーションとその使用目的によって異なります。

アップデート

また、テーブル内のデータの量を考慮する必要がある場合もあります。この関数ORDER BYを使用することに気づきました。CAST()これは非効率的であり、クエリが遅くなる可能性があることに注意してください。

于 2012-06-08T03:12:33.190 に答える