19

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

たとえば、アクセス許可、ユーザー、ユーザー グループ、およびロールを持つ RBAC タイプのモデルを考えてみましょう。複雑で柔軟なモデルには、次のルールを含めることができます。

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

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

上記は、エンティティを格納するテーブルと関係を格納する別のテーブルを作成することにより、RDBMS である程度達成できますが、単純なクエリを実行するために必要な SQL が過度に複雑になり、パフォーマンスに影響を与える可能性もあります。

4

5 に答える 5

13

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

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

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

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

于 2010-08-02T18:36:23.617 に答える
10

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

参照整合性なしではどうしようもないと判断した場合は、おそらく RDBMS に行き詰まっているのではないかと思います。予想される問題のいくつかを回避するために使用できるいくつかのトリックがあります。https://stackoverflow.com/questions/3395606...でいくつか取り上げています。それでも、動的でアプリオリなスキーマを必要とし、メタスキーマ要素を備えたこの種のデータ モデルの場合、RDBMS は常に扱いにくいものになります。

参照整合性を放棄する場合でも、考慮すべき 3 つのアプローチがあります。

  1. Map/Reduce - 分散レコード指向 (MongoDB など) と列指向 (Cassandra など) の 2 種類があります。拡張性は非常に優れていますが、SQL のような構文はありません。結合します。アーキテクチャを特定のクエリ タイプに一致させることが重要です。あなたの場合、エンティティ自体間の関係ではなく、エンティティとその属性に焦点を当てているため、おそらく分散レコード指向のストアを検討します。ただし、単一のノードを超えて拡張する必要があると予想した場合にのみ、非常にうまく拡張します。

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

  3. グラフ ストア - いくつかの種類があります。1 つ目は、大規模なアドホック キー値ストア (DBM/TokyoTyrant など) です。2 つ目はタプルスペース (Neo4j と考えてください) です。3 つ目は RDF データベースです (Sesame/Mulgara を考えてみてください)。私は Mulgara の開発に貢献したことから、RDF が好きなので、最も客観的なコメント者ではありません。それでも、スケーラビリティの制約により RDF ストアの使用が許可される場合、RDF の表示セマンティクス (noSQL データストア オプションの中ではまれ) によって許可される推論は非常に貴重であることがわかります。

于 2010-08-04T10:59:27.570 に答える
7

一部の NoSQL ソリューションは、セキュリティと SQL をサポートしています。これらの 1 つが OrientDB です。セキュリティ システムについては、こちらで (かなり) よく説明されています。

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

于 2010-08-12T16:13:18.153 に答える
2

Neo4jグラフ データベースでサポートされているGremlin言語があります。あなたの例については、Access control lists the graph database wayhereをご覧ください。また、Neo4j への REST API と Gremlin コンソールを含む Web ベースのツールもあります。neo4j/webadminを参照してください。

于 2010-08-04T09:51:14.170 に答える
-2

MongoDBはドキュメント ベースのデータベースであり、柔軟なスキーマを備えています。それがあなたのニーズに合っているかどうかを確認するのは素晴らしいことであり、時間の価値があります.

于 2010-08-04T11:04:34.797 に答える