0

私は小さなコンテンツ管理システムに取り組んでおり、その中のデータは非常にリレーショナルです。私は小さな抽象化から始めましたが、おそらく完全なエンティティ属性値モデルを使用しようとしています。しかし、私はこれをリレーショナルデータベース(pgsql)上に構築しており、そのような強力なエンジンの上にモデルを再構築する意味はありません。EAV対ダイレクトテーブル操作の警告?

これはあまり一般的ではないので、誰かがすでにこのことを考えていると思うし、それが罠かもしれません。誰かが、アプリケーション内でテーブルを作成したり変更したりして、ユーザーがカスタマイズ可能なデータモデルを表現する際の注意点を私に説明できましたか?

+0

スキーマの変更は(ほとんど)回避する必要があります。 EAVは避けるべきである。 –

+0

なぜですか?他の選択肢はありますか? – vinnylinux

+0

eavでタグ付けされた他のものを読む。 http://mysql.rjweb.org/doc.php/eav –

答えて

1

私はあなたがEAVのすべてのダウンサイドを見てきたと仮定します。

あなたは達成したいことを非常に簡潔に記述していますので、私は推測するつもりです。あなたの開発者やコンテンツ管理者にスキーマを定義させ、そのスキーマに基づくデータの理由。たとえば、show all entities of type 'article' belonging to category 'architecture' in status 'published' order by 'publication_date' descendingです。

これは、リレーショナルモデルを持っていて、クエリの作成時に属性タイプを知っていれば、簡単に書くことができます。

EAVを使用して書き込むのは難しいクエリです。

属性を事前に知らなければ、リレーショナルモデルに書き込むことも難しいです。基本的には、ドメインモデルとリレーショナルデータベースの間に翻訳レイヤーを書く必要があります。私はこれを行ったCMSシステムを使って作業しました。彼らが通常課す制限は「フォワードのみ」の変更です。属性は追加できますが、削除や変更はできません。

これは、データスキーマを難しいドメインモデルにマッピングし、使用するジェネレータが新しい属性を追加するのにはかなり効果的ですが、名前を変更するときやデータを変更するときには本当に混乱しますタイプを削除するか、削除します。あなたは属性「PUBLICATION_DATE」を削除した場合たとえば、あなたはそれが発生したかどうかを確認するために生成されたすべてのファイルをチェックする必要があると思いますし、その後推移、それらの方法などに応じて、方法を探し

EDIT:

ますコンテンツ管理者が新しいエンティティを作成し、それらのエンティティ間の関係を作成するようにします。その長所と短所は、リレーショナルデータベースはこれほど大きくはないということです。最も近いパラレルは、オブジェクト指向のアプリケーションから基本データベースを抽象化することを目的としたオブジェクト・リレーショナル・マッピング・ツールです。 ORMは、エンドユーザーではなく開発者を狙っており、独自のコグニティブオーバーヘッドを導入しています。彼らはあなたが苦境に遭遇するまで本当にうまく動く傾向があります。

代わりに、ドキュメント指向のソリューション(MySQLはXMLとJSONの両方をネイティブでサポートしています)を使用します。純粋なリレーショナル・モデルの検証機能とスケーラビリティー機能の一部が失われてしまいますが、シンプルなものがたくさんあります。たとえば、すべてのコンテンツ項目に適用されるすべての固定属性を持つ「content_item」という表があり、ワークフロー・ロジックを実装できますが、コンテンツ自体をcontent_item表内のJSON文書に格納できます。

+0

を読むカスタムフィールドだけでなくカスタムリレーションシップも読んでください。ユーザーは、一対多と多対多の関係を持つ新しいエンティティを作成できます。 私はデータベーススキーマを直接使用し、リアルタイムで修正を行うことを検討していたのです。 – vinnylinux