私たちは、(できれば)数千の顧客をサポートする新しいプロジェクトに着手しようとしているので、アーキテクチャを検討しています。アプリケーションの重要な側面の 1 つは、複数の言語 (英語、スペイン語など、言語の数に制限はありません) のサポートです。これは従来の RDBMS (Sql Server、Oracle など) のモデル化に多くの経験がありますが、NoSQL の「モデル化」に関しては苦労しています。SQL モデルでは、すべての異なる言語を含む「言語」テーブルを指す「言語」列を持つ「テキスト」テーブルを作成します。これにより、すべてのテキストをサポートされているすべての言語で表すことができます。簡単な例を考えてみましょう:
表: カテゴリ列: id (PK)、Enabled (Bool)
表: Category_Descriptions 列: id (PK)、CategoryID (FK)、LanguageID (FK)、説明 (テキスト)
表: 言語の列: id (PK)、Enabled (Bool)
表: Language_Descriptions 列: id (PK)、DescriptionLanguageID (FK)、LanguageID (FK)、Description (Text)
したがって、すべての言語が Language テーブルに格納され、対応する説明が Language_Descriptions テーブルに格納されます。さらに、すべてのカテゴリが Category テーブルに格納され、すべての言語の説明が Category_Descriptions テーブルに格納されます。特定の言語 (英語 = 1) のすべてのカテゴリを取得するには、次のようにします。
select c.id, cd.Description
from Category c, Category_Descriptions cd
where c.id = cd.CategoryID
and c.Enabled = 1;
もちろん、カテゴリはそれ自体ではあまり役に立ちません。インシデント レポートなど、別のエンティティの一部になります。
表: インシデントの列: ID (PK)、Created (日付)、CategoryID (FK) など。
このテーブルから情報を取得するには、前と同じ結合を行い、正しい言語の説明列を選択します。基本的なことは、これまでに行ったことがある...
最後に、私の質問にたどり着きます。これを NoSQL データベースに適切に保存するにはどうすればよいでしょうか。:)
私はいくつかの(悪い)解決策を見てきました:
- コードのみを保存し、正しい説明ランタイムを検索します
- 最後に使用した説明を言語コードとともに保存し、言語が変更された場合は更新します (別のユーザー)
- すべての説明を同じドキュメントに保存する
- コードの説明をアクティブな言語で保存し、必要に応じて新しい言語に説明を追加します (つまり、未使用の言語で要求された場合)。
これらのソリューションにはすべて、かなりの数の欠点があり、実装と維持に多くの作業が必要です...したがって、これを最適に解決する方法についての意見をいただければ幸いです。
編集: NoSQL を検討している理由は 2 つあります。
- パフォーマンス (スケール)
- 動的スキーマ (SQL でこれを実現するには、多くの作業を行う必要があります)