私が推奨する設計は、オブジェクト指向言語で行う方法に似ています。これにより、潜在的に複雑な結合のオーバーヘッドと、複数のテーブルのオーバーヘッドが発生します。データベースを次のようにレイアウトします。
Table GeneralTickets
(
ticket_id number,
customer_id number,
... other fields that are **common to all tickets**
)
Table ComplaintTickets
(
complaint_id number,
ticket_id number (FK to GeneralTickets#ticket_id),
product_id number,
... other fields
)
Table FeatureTickets
(
feature_id number,
ticket_id number (FK to GeneralTickets#ticket_id),
... other fields
)
この場合、No-SQL ソリューションはあなたが探しているものではありません。この問題は 1) 関係データベースにより適切であり、2) No-SQL ソリューションに適切なほど多くのデータを記録しているとは思えません。
アップデート
レポート機能に関しては、私はまだこのリレーショナル データベースにこだわっています。基本的に、解決する必要があるデータ ウェアハウスの問題があります。やりたいことは、一連のベース テーブルを用意することです (これらは、最終的にレポートを作成するテーブルになります)。これらのベース テーブルから、 と呼ばれるものを作成しますmaterialized views
。これらmaterialized views
は、特定の期間 (つまり、1 月のレポート) について計算された後のすべてのデータを処理します。
あなたが言ったように、複雑な結合と複数のテーブルのオーバーヘッドは、私が No-SQL ソリューションを考えている主な要因です。SQL ソリューションはメンテナンスを増やし、パフォーマンスも低下させます。チケット システムは他のシステムと密接に結びついていないと思います。製品の詳細や顧客の詳細などの他の詳細については、変更イベントで SQL DB から同期することがあります。2番目の問題をどのように考えるか説明してもらえますか?
今、あなたが残したコメントに。SQL は、書き方が悪い場合にのみ遅くなります。これが、デカルト結合と単純なインデックス ルックアップの違いです。メンテナンスは、これらすべてにおいて小さな役割を果たします。ただし、ドメイン オブジェクト (結果セットの処理後に初期化されるクラス) を見ずにメンテナンスの側面について話すことはできません。ドメインを現在よりも正確になるように変更する必要がある可能性があります(間違っていると言っているのではなく、より正確になる可能性があるというだけです)。複数のシステムの同期を維持することは、最もやりたくないことの 1 つです。