約5つのコアエンティティを持つphp/mysqlシステムがあります。プロジェクトごとにこれらのエンティティの一部のカスタムフィールドを作成する機能を追加する必要があります。リレーショナルデータベース(mySQL)を使用したユーザー拡張可能エンティティへのアプローチ
これらには、ラベル、キー、タイプ、デフォルト値、および可能な値が含まれます。
これは、カスタムの日付フィールド、またはカスタムドロップダウンリストをUIに追加し、この値を特定のエンティティに保存できるようにするためです。
この種のデータをmySQLデータベースに格納する最良の方法は何ですか?フィールドの設定と特定のエンティティの現在の値の両方を保存する必要があります。
https://ayende.com/blog/3498/multi-tenancy-extensible-data-model私はここに様々なオプションを見て持っていた
..しかし、これは、テナントレベル、より多くのプロジェクトレベルでは本当にないです。
私は、エンティティタイプとプロジェクトIDに対して、フィールドの設定を保持するために...
- CustomFieldsテーブルを考えていました。 (| FIELD_ID | FIELD_VALUE ENTITY_ID)
はその後、我々は、エンティティとこれらのカスタム値エンティティを取得する間のリレーションシップを作成し、フィールドごとに行 -
この問題は、カスタムフィールドと同じ数の行が[値]テーブルに表示されるため、エンティティを保存するとX個の余分な行が生成されるという問題があります。さらに、これらはバージョン管理されているので、新しいバージョンが作成されると、その新しいバージョン用に別のX行が作成されます。
また、名前のフィールドのインデックスを作成することはできませんが、エンティティに対して返すキー値のペアを構築するためには、構成と値に参加する必要があるため、結合はかなり複雑になります。フィールド名が実際に値だったときにカスタムフィールド名に基づいて選択しますか?
動的な列をテーブルに追加したくないので、現在のクライアント/プロジェクト内のものだけでなく、システム全体のすべてのエンティティに影響します。
もう1つの方法は、値をJSON列に保存することです。
これはエンティティ行自体にあるかもしれませんcustomFields
またはそれに類するものです。これは、フィールドごとの余分な行を防止するだけでなく、インデックスの欠如などの問題もあり、configテーブルへの参加が必要です。ただし、key=value
がJSON ... WHERE entity.customFields->"$.myCustomFieldName" > 1
に格納されている場合は、プロパティ名でクエリを実行できます。
jsonにファイル名を格納すると、一度作成したファイルを変更することはできません。苦労はありません。
、誰もがそれをはるかに高く評価されるだろうに私を指すように、このためのアプローチ、または物品上の任意のアドバイスを持っている場合 - 前に必ずイムこれが解決されている何回も....
まあ、私は同意しません。キーバリューはJSON以上を吸う。私は明示的な列(_few_ものの場合)と任意の迷惑メールのJSONとの間で妥協することを好みます。この一般的なトピックに関するさらに多くのQ&Aについては、EAVタグを参照してください。 –
ええ - 私はそれらの2つの答えが私のジレンマを要約すると思います!病気はEAVの記事でいくつかの読書を行う... –