私はCouchDBとMongoDBの柔軟なスキーマ機能が大好きですが、SQLServerのリレーショナル「結合」機能も大好きです。私が本当に望んでいるのは、PERSON、COMPANY、ORDERなどのテーブルを基本的に「オープンスキーマ」にする機能です。各テーブルにはIDがあり、残りの列はjsonスタイル{ID:12,firstname:"Pete",surname:"smith",height:"180"}
で定義されていますが、PERSONに効率的に参加できます。直接または多対多の外部参照テーブルを介してCOMPANYに送信します。SQL Serverに「オープンスキーマ」をSQLに組み込む計画があるかどうか、またはMongoまたはCouchが効率的な参加をサポートする計画があるかどうかを誰かが知っていますか?どうもありがとう。
4 に答える
CouchDBは、さまざまなドキュメント/エンティティ間の関係を確立するためのさまざまな方法を提供します。開始するには、wikiのこの記事を確認してください。
リレーショナルバックグラウンドから来る場合、問題を解決しようとするときはいつでも同じ用語と考え方を使い続ける傾向があります。NoSQLソリューションは非常に異なることを理解することが非常に重要です。そうでない場合、既存の実際の目的はありません。これらのさまざまなNoSQLソリューションがどのように機能するかを実際に理解して、アプリケーションの要件と比較して、それが適切かどうかを確認する必要があります。
MongoDB =NoSQL=結合なし-これまでにない。
データモデルまたはプロジェクトの要件のためにJOINが必要な場合は、RDBMSを使用してください。
MongoDBの代替手段:
非正規化
埋め込まれたドキュメントを使用する
複数のクエリ
これは、技術的な観点から、大規模なクエリを実行するには非効率的ですが、XMLデータ型を使用すると、行ごとに異なる可能性のある必要な構造を格納できます。
私が知っていることではありませんが、あなた自身のEAVをロールすることはそれほど難しくありません、結局それはたった3つのテーブルです:)
- エンティティは、関連付けられたテーブル名を格納します。
- 属性には、列名、データ型、およびNULL可能かどうかが格納されます。
- 値には、必要なデータ型ごとに1つのNULL可能列が含まれます。
エンティティ1..*属性1..*値
.NETを使用していると仮定して、EAVインターフェイスを定義し、いくつかのPOCOを作成して、EntityFrameworkまたは選択したORMに関連付けを関連付けさせます。LINQは、この種の操作に最適です。
また、スキーマの一部は既知であるが、カスタムデータの柔軟性が必要なハイブリッドモデルを作成することもできます。これを念頭に置いてドメインモデルを設計する場合(つまり、モデルでEAVインターフェイスを使用する場合)、EAVをEFデータコンテキスト(またはその他)にベイクインして、各エンティティの属性とその値の読み込みを自動化できます。EFエンティティは、それが属するテーブルエンティティを知る必要があります。
もちろん、パフォーマンスと柔軟性を(潜在的に)交換しているため、これは完璧なソリューションではありません。保持するデータの量とパフォーマンス要件によっては、ほとんどのスキーマが既知であり、不明な割合が少ないモデルに適している場合があります。YMMV。