12

私はSaaSで働いています。ここでは、テナントは連絡先の複数のリストを持つことができ、各リストには、このリストの連絡先が格納できる任意の数のカスタムフィールドを含めることができ、リストの接続に含めることができる任意の数のグループを含めることができます(グループが使用されます)リストの連絡先をセグメント化するため)。各連絡先には、1つの必須フィールドがあります。email_addressと、前述のリストに定義されている任意の数のユーザー定義フィールドです。リストの連絡先は、所属するグループとユーザー定義の値に基づいて見つけることができなければなりません。最大30のユーザー定義フィールドを用意する必要があります。この問題を解決する3つの方法がわかりました。

  1. 一種のEAVを使用します(私たちはこのようにしようとします)が、それはかなり複雑に見えます。テーブルリスト(テナントのリスト)、関連テーブルcustom_fields、リストのサブスクライバーのemail_addresesを格納した関連テーブルsubscribers、サブスクライバーに関連するテーブルsubscribers_custom_data、およびcustom_fieldsテーブル(サブスクライバーのカスタムフィールドの格納値)があります。 。

  2. フィールドテーブルのパターン。説明はこちらhttp://blog.springsource.com/arjen/archives/2008/01/24/storing-custom-fields-in-the-database/です。この場合、カスタムフィールドに関連するフィールドを使用します。これにより、すべてのカスタムフィールドが列に格納されます。たとえば、30個の列があり、可能な各カスタムフィールドの値が格納され、テーブルには、列名とユーザー定義の名前のマッピングが格納されます。分野。それも複雑に見えます。カスタムフィールドの値で検索するには、少なくとも30個のインデックスが必要ですが、他にも問題があります。

  3. 少なくともユーザー定義のフィールドと、場合によってはリストのグループを格納するために、ある種のNoSQLデータベースを使用すること。このようなデータベースがここで役立つと思いますか。もしそうなら、カスタムフィールドとグループを格納するための設計方法を教えてください。さまざまなタイプのNoSQL、たとえばMongoDbのようなドキュメント指向を調べようとしていますが、この問題の解決にどのように役立つかすぐにはわかりません。ここに任意の属性を格納できますが、カスタムフィールドの値を検索するには、事前にそれらにインデックスを付ける必要があるため、どのカスタムフィールドを使用するかを知る必要があります。

それについての情報をありがとう。

4

1 に答える 1

12

すべてのフィールドに常にインデックスを付けたい場合は、すべてにインデックスを付けるApacheSolrのようなテクノロジーを試してください。Solrの主な目的は全文検索エンジンになることですが、基本的にはドキュメント指向のデータベースです。

他のオプションに関するコメントは次のとおりです。

  1. EAVは良くありません、そして私はそれを使うことに反対です。リレーショナルデータベース設計の多くのルールに違反し、拡張性がありません。私はこれについてStackOverflowでたくさん書いているので、タグの下で私の答えを検索してください。eav

  2. 30個のインデックスだけでなく、インデックスの可能な組み合わせを処理するには、最大30個の階乗インデックスが必要です。複数列のインデックスを作成できることを覚えておいてください。これらのタイプのインデックスは、特定のクエリをサポートするために重要です。もちろん、これほど多くのインデックスを作成することは完全に非現実的です。最適化するクエリに一致するインデックスを作成する必要があります。どのフィールドがあり、どのクエリがそれらに対してあるかわからない場合、最適化することはできません。

  3. MongoDB / CouchDBのようなドキュメント指向データベースは、支持者がどれほど主張しようとしても、魔法ではありません。高速検索のためにドキュメントにインデックスを付ける必要があります。つまり、ドキュメントのインデックス可能なフィールドを知っている必要があります。

    実行時にインデックスを作成することは問題です。インデックスを作成するデータの量によっては、時間がかかる場合があるためです。インデックス作成を「オフライン」で実行する方法を見つけて(つまり、単一のhttpリクエスト中にユーザーにそれを待たせないでください)、完了時に通知する必要があります。

  4. FriendFeedがMySQLを使用してスキーマのないデータを格納する方法について読む必要があります。これらはシリアル化されたLOBを使用し、基本的にすべてのカスタム属性を1つのXMLまたはJSONBLOBに結合します。したがって、ユーザーはいつでも必要な数の追加のカスタムフィールドを作成できます。ただし、特定のカスタムフィールドを検索可能にする前に、そのフィールドに特定の値が含まれている行を参照する子テーブルを作成します。したがって、特定のユーザー定義のカスタムフィールドのインスタンスの数と同じだけのインデックスを取得します。また、すべてのフィールドを検索可能にする必要はありません。

于 2012-01-23T07:23:54.443 に答える