1

約5つのコアエンティティを持つphp/mysqlシステムがあります。プロジェクトごとにこれらのエンティティの一部のカスタムフィールドを作成する機能を追加する必要があります。リレーショナルデータベース(mySQL)を使用したユーザー拡張可能エンティティへのアプローチ

これらには、ラベル、キー、タイプ、デフォルト値、および可能な値が含まれます。

これは、カスタムの日付フィールド、またはカスタムドロップダウンリストをUIに追加し、この値を特定のエンティティに保存できるようにするためです。

この種のデータをmySQLデータベースに格納する最良の方法は何ですか?フィールドの設定と特定のエンティティの現在の値の両方を保存する必要があります。

https://ayende.com/blog/3498/multi-tenancy-extensible-data-model

私はここに様々なオプションを見て持っていた

..しかし、これは、テナントレベル、より多くのプロジェクトレベルでは本当にないです。

私は、エンティティタイプとプロジェクトIDに対して、フィールドの設定を保持するために...

  • CustomFieldsテーブルを考えていました。 (| FIELD_ID | FIELD_VALUE ENTITY_ID)

はその後、我々は、エンティティとこれらのカスタム値エンティティを取得する間のリレーションシップを作成し、フィールドごとに行 -

  • A CustomFieldValuesテーブルはフィールドに対して保存された値を保持します。

    この問題は、カスタムフィールドと同じ数の行が[値]テーブルに表示されるため、エンティティを保存するとX個の余分な行が生成されるという問題があります。さらに、これらはバージョン管理されているので、新しいバージョンが作成されると、その新しいバージョン用に別のX行が作成されます。

    また、名前のフィールドのインデックスを作成することはできませんが、エンティティに対して返すキー値のペアを構築するためには、構成と値に参加する必要があるため、結合はかなり複雑になります。フィールド名が実際に値だったときにカスタムフィールド名に基づいて選択しますか?

    動的な列をテーブルに追加したくないので、現在のクライアント/プロジェクト内のものだけでなく、システム全体のすべてのエンティティに影響します。

    もう1つの方法は、値をJSON列に保存することです。

    これはエンティティ行自体にあるかもしれませんcustomFieldsまたはそれに類するものです。これは、フィールドごとの余分な行を防止するだけでなく、インデックスの欠如などの問題もあり、configテーブルへの参加が必要です。ただし、key=valueがJSON ... WHERE entity.customFields->"$.myCustomFieldName" > 1に格納されている場合は、プロパティ名でクエリを実行できます。

    jsonにファイル名を格納すると、一度作成したファイルを変更することはできません。苦労はありません。

    、誰もがそれをはるかに高く評価されるだろうに私を指すように、このためのアプローチ、または物品上の任意のアドバイスを持っている場合 - 前に必ずイムこれが解決されている何回も....

  • 答えて

    0

    JSONレコード:いいえ!何千回も!それを行うならば、誰かがあなたのシステムを実際に何千万ものレコードで使用するまで待ってから、余分なフィールドの1つを検索するように求めます。あなたのサポート担当者があなたの名前を呪います。

    キーバリューストア。おそらくそうだ。このデザインはWordPressに非常に広く存在しています。 wp_posts(ブログのページと投稿)に適用されるメタデータフィールドを含むwp_postmetaというテーブルがあります。成功していることが証明されています。

    このようなものを使用するには、複数回参加する必要があります。例えば、高さと目の色を検索するために、あなたはそのWHERE句ショーでCASTのよう

    SELECT p.person_id, p.first, p.last, h.value height, e.value eye_color 
        FROM person p 
        LEFT JOIN attrib h ON p.person_id = h.person_id AND h.key='eye_color' 
        LEFT JOIN attrib e ON p.person_id = e.person_id AND e.key='height' 
        WHERE e.value='green' and CAST(h.value AS INT) < 160 
    

    を必要とするだろう、あなたにも、データ型といくつかの闘争があるでしょう。

    この種の属性検索ではLEFT JOIN操作が必要です。通常の内部JOIN操作では属性のない行は表示されません。これは動作しません。

    しかし、インデックスでうまくやっていれば、この方法ではまともなパフォーマンスを得ることができます。

    私の例で想定されているテーブル構造には、各追加フィールドを説明するテーブルはありませんが、追加する方法はわかっています。また、マルチプロジェクト/マルチテナントのデータ分離を明示的にサポートしていません。しかし、それを追加することもできます。

    +0

    まあ、私は同意しません。キーバリューはJSON以上を吸う。私は明示的な列(_few_ものの場合)と任意の迷惑メールのJSONとの間で妥協することを好みます。この一般的なトピックに関するさらに多くのQ&Aについては、EAVタグを参照してください。 –

    +0

    ええ - 私はそれらの2つの答えが私のジレンマを要約すると思います!病気はEAVの記事でいくつかの読書を行う... –

    関連する問題