18


5

参照整合性(カスケードの削除)を使用したNoSQL / RDBMSハイブリッド?

参照整合性の利点を提供し、クエリにSQL型言語を使用できるデータベースがありますが、データ属性およびエンティティ間の関係に関してエンティティを大まかに定義できますか?

E.g. 権限、ユーザー、ユーザーグループ、ロールがあるRBACタイプモデルを採用します。 複雑/柔軟なモデルには、次のルールがあります。

  • ロールには1つ以上のアクセス許可を設定でき、アクセス許可は次のものに属することができます 1つ以上の役割

  • ユーザーは1つ以上の権限を持つことができ、権限は次のものに属することができます 1人以上のユーザー

  • ユーザーグループは1つ以上のアクセス許可を持つことができ、アクセス許可は 1つ以上のユーザーグループに属している

  • ユーザーは1つ以上のロールを持つことができ、ロールは1つ以上に属することができます ユーザー

  • ユーザーグループは1つ以上のロールを持つことができ、ロールは1つ以上に属することができます より多くのユーザーグループ

  • 役割は1つ以上の役割を持つことができ、役割は1つ以上に属することができます 役割

RDBMSで上記のモデルを作成するには、多数の交差テーブルを作成する必要があります。 理想的には、データベースで定義したいのは、エンティティ自体(ユーザー、ロールなど)といくつかの必須属性だけです。 それ以外はすべて動的になります(つまり、 DDLは不要)、例: 事前定義されていない新しい属性を持つユーザーを作成できました。 データベースは通常のRDBMSのように参照整合性を処理しますが、事前定義されていないエンティティ間の関係を作成することもできます。

上記はRDBMSでエンティティを保存するテーブルとリレーションシップなどを保存する別のテーブルを作成することである程度達成できますが、これは単純なクエリを実行するために必要なSQLを過度に複雑にし、パフォーマンスに影響を与える可能性があります。

5 Answer


13


ほとんどのNoSQLデータベースは、非常にうまく拡張できるように構築されています。 これは一貫性を犠牲にして行われますが、その一貫性は参照整合性の一部です。 そのため、ほとんどのNoSQLは、どのタイプのリレーショナル制約もサポートしていません。

関係をサポートするNoSQLデータベースのタイプが1つあります。 実際、それは特にリレーション用に設計されています:http://en.wikipedia.org/wiki/Graph_database [グラフデータベース]。 グラフデータベースには、ノードとこれらのノード間の明示的な関係(エッジ)が格納されます。 ノードとエッジの両方に、事前定義されたスキーマに縛られることなく、キー/値ペアの形式でデータを含めることができます。

グラフデータベースは、2つのノード間の最短パスの検索や、現在のノードから特定の距離内にあるすべてのノードの検索など、リレーショナルクエリや気の利いたグラフ操作に最適化されています。 ロール/許可のシナリオではこれは必要ありませんが、必要な場合は、RDBMSを使用して達成するのがはるかに難しくなります。

別のオプションは、RDBMSを使用して関係を保存し、ドキュメントデータベースを使用して実際のデータを保存することにより、データレイヤー全体をハイブリッドにすることです。 これにより、アプリケーションが少し複雑になりますが、それほど悪い解決策ではないと思います。 2つの異なるテクノロジーを使用し、どちらも対応するように設計された問題を処理します。


9


質問で指定する要件を考えると、グラフデータベースはおそらく探しているものですが、他のオプションもあります。 @Niels van der Restが言ったように、「先験的スキーマなし」と「参照整合性」という2つの制約は、調整が非常に困難です。 トピックマップベースのデータベースを見つけることができるかもしれませんが、特定の実装に精通していないため、確実に言うことができません。

参照整合性なしでは本当にできないと判断した場合、おそらくRDBMSに固執しているのではないでしょうか。 あなたが予想するいくつかの問題を回避するかもしれないいくつかのトリックがあります。https://stackoverflow.com/questions/3395606/what-is-your-opinion-on-using-textual-identifiers- in-table-columns-when-approachi / 3395936#3395936 [https://stackoverflow.com/questions/3395606 …​]、いくつかのアイデアが得られるかもしれません。 それでも、メタスキーマ要素を備えた動的な事前事後スキーマを必要とするこの種のデータモデルでは、RDBMSは常に扱いにくいものになります。

参照整合性を放棄する場合は、3つのアプローチを検討する必要があります。

  1. Map / Reduce-2つのフレーバー:分散レコード指向(考えて、 MongoDB)、列指向(Cassandraなど)。 本当にうまくスケールしますが、SQLのような構文はありません。サックに参加します。アーキテクチャを特定のクエリタイプに一致させることが重要です。 あなたの場合、エンティティ間の関係ではなく、エンティティとその属性に焦点を当てているので、おそらく分散レコード指向ストアを検討します。しかし、単一のノードを超えてスケ​​ーリングする必要があると予想された場合にのみ、それらは本当にうまくスケーリングします。

  2. ドキュメントストア-技術的には2つのフレーバーがありますが、そのうちの1つは 上記の分散レコード指向のmap / reduceデータストア。 もう1つは逆索引です(Lucene / Solrなど)。 逆インデックスのパワーを無視しないでください。わいせつで複雑なレコード述語を驚くほど速く解決できます。 うまく処理できないのは、相関または大規模なリレーショナル結合を含むクエリです。 それでも、あなたは信じられないほどの柔軟性に驚かれることでしょう、十分に複雑なレコード述語はあなたに与えます。

  3. グラフストア-いくつかのフレーバーがありますが、最初は大規模なものです。 アドホックKey-Valueストア(DBM / TokyoTyrantなど); 2番目はタプルスペースです(Neo4jを考えてください)。 3番目はRDFデータベースです(Sesame / Mulgaraなど)。 私はRDFのソフトスポットを持っており、ムルガラの開発を支援してきたので、私は最も客観的なコメント者ではありません。 それでも、スケーラビリティの制約によりRDFストアの使用が許可される場合、RDFの表記法セマンティクス(noSQLデータストアオプションの中でもまれ)で許可されている推論が非常に貴重であることがわかります。


7


一部のNoSQLソリューションは、セキュリティとSQLをサポートしています。 これらの1つはOrientDBです。 セキュリティシステムは(かなり)よく説明されていますhttp://code.google.com/p/orient/wiki/Security [こちら]。

さらにSQLをサポートします。


2


Neo4jグラフデータベースでサポートされているhttp://download.eclipse.org/egit/updates-nightly[Gremlin]言語があります。 あなたの例については、http://blog.neo4j.org/2010/02/access-control-lists-graph-database-way.html [アクセス制御はグラフデータベースの方法をリストしています]とhttp:// wikiをご覧ください.neo4j.org / content / ACL [こちら]。 Neo4jへのREST APIとGremlinコンソールを含むWebベースのツールもあります。http://github.com/neo4j/webadmin [neo4j / webadmin]を参照してください。


-2


MongoDBをチェックアウトすることをお勧めします。これはドキュメントベースのデータベースであり、柔軟なスキーマを備えています。 それはあなたのニーズに合っているかどうかを確認するのに最高です。