web-dev-qa-db-ja.com

たくさんの列または結合がDjango

たくさんの属性を持つユーザーオブジェクトを保存して表示する単純なDjangoアプリを書いています。

ユーザーは最大300の属性を持つことができます。

ただし、これらの属性はグループ化できます。

たとえば、「Favourite Dish」の1つのグループと、その下の属性がコスト、フレーバー、料理などであり、「Favourite Dog」の別のグループが、コスト、フレーバー、品種などであるとします。

通常の状況では、データを区分化し、属性の各グループを独自のテーブルに保存しますが、このアプリはほとんどの場合、すべてのデータを表示してクエリを実行します。

例:このアプリのメインページには検索ボックスがあり、ユーザーはモデル全体の任意の属性を検索できるはずです。これは、「通常の」方法で実行すると多くの結合が必要になりますが、300列のテーブルがある場合は結合が少なくなります。

NoSQLの使用を検討しましたが、リレーショナルスキーマにより適したデータが他にもあります。

これのベストプラクティスは何ですか?

ありがとう:)

1
user2288983

これをどのように表現するかはわかりませんが、このタイプのアプリケーションはDjangoの目的ではありません。

Djangoは、無料の管理インターフェイスを備えたシンプルなCRUDベースのWebサイト用に作成されていますが、MVCフレームワークで検索エンジンをシューホーンしようとしてもうまくいくとは思いません。 (ただし、今では拡張機能があるかもしれませんが、私のDjango経験は古くてさびています)

300列を作成すると、300 ORsのインデックスを作成できません。また、すべての列を検索可能にする必要がある場合は、10列がそれぞれ結合された30テーブルも作成できません。

私が考えることができる唯一の合理的なアプローチは、EAVパターン(拡張機能があります: Django-eav )を使用することですが、それは私の意見では他の問題を引き起こすでしょう。

また、Djangoがどのように機能するかについて誤解していると思いますが、モデルファイルでデータモデルを定義し、それを任意のデータベースと同期できるようにする必要があります。 NoSQLデータベースとにかくカスタムコードを書かなければならないと思います。

これを行うことを意図していなかったフレームワークで要件を調整するために作成する必要のあるコードの量によっては、カスタムアプリケーションを作成することもできます。

要件に応じて(必ずしもすべてが明確であるとは限りません)、選択したフレームワークに一致するソリューションとして選択したものは何でも、300列またはEAV値を検索するため、全文インデックス検索またはインデックスソリューションを選択する必要があると思います、まだ苦痛になりそうです。

明らかにデータ主導の要件の場合、データはプラットフォームを決定する必要があり、その逆ではありません。

あなたは、フレームワークに設計されていないことを必死にさせようとしています。