私は、約 4 年前に e ラーニング用に構築したオーサリング システムでこのアプローチを採用しました。当時は自分が EAV をやっているとは知らなかったのですが、名前と値の型のペアを使っているだけでずる賢いと思っていました。変更要求があるたびに列を左側に調整するのにうんざりしていたので、レコードを増やしても、再設計は少なくなると考えました。
1 つのテーブルでシステムの階層を構築する最初のテストを行いました。これは、約 4 つのプロジェクト、25 の製品、および 4 ~ 5 のツールで、それぞれが主キーにリンクする層の整数を介して割り当てられた場合に優れたパフォーマンスを発揮しました。
システムを通過するアセットを記録してきました。これは、FLV ファイル、SWF、JPG、PNG、GIF、PDF、MP3 などを意味し、それらに関するすべての MIME タイプの詳細を記録しています。これは、各ファイルでわずか 4 ~ 10 個の属性の範囲です。合計で最大 800 万の「資産データ」レコードがあり、約 800K の資産 (推定) があります。そのすべての情報をレポートの列にまとめてほしいという依頼がありました。SQLステートメントは、それが使用されたコンテンツ、製品、またはプロジェクトを知りたい場合はもちろん、それ自体で多くのテーブル結合を行う必要があります。
きめ細かな観点から見ると、うまく機能します。Excel レポートの観点から、シートベルトを着用してください。レポートで誰かが望む方法でデータを反映するテーブルにスナップショットを作成することで軽減しましたが、その情報をコンパイルするのに時間がかかり、別のサーバーにオフロード (SQL ダンプ) する必要がありました。
私はこれが正しいことであるかどうか自問自答していましたが、このプロジェクトでは、この大規模なレポートの要求まで「はい」と答えることができました。しかし、それはサーバーがすべてを相関させることでかなり汗をかきます. 彼らが行うクエリの深いレベルに本当に依存します。
私は 2002 年から SQL に手を出しており、それをツールのサポートに使用しているため、大規模なものは生き残っていません。100 万人を超える、テラバイト以上のデータベースだったら、おそらく頭を悩ませていたでしょう。
特記事項: このシステムは RedHat 上にあり、32 ビットであることがわかりました。PHP 処理スレッドの多くは 1 つ以上の CPU コアで実行できず、サーバーにはさらに 7 つのコアがアイドル状態にありました。このマシンで実行に最大 45 分かかっていたクエリは、適切に構成された 64 ビット システムでは実際には 14 ~ 25 秒で実行できました。また、パフォーマンスを検討する際の考慮事項でもあります。