質問

MySQL データベースがあり、そのデータベース内の特定のテーブルは 1 対多の形式で自己参照する必要があります。スケーラビリティを確保するには、可能な限り最も効率的なソリューションを見つける必要があります。私にとって最も明らかな 2 つの方法は次のとおりです。

1) テーブルにテキストフィールドを追加し、そこに主キーのシリアル化されたリストを保存します。

2) 各行が 1 対 1 になるリンカー テーブルを保持します。

ケース #1 では、テーブルが (空間的なアナロジーを使用して) 非常に広く拡大していることがわかりますが、ケース #2 では、リンカー テーブルが非常に多くの行に拡大していることがわかります。これにより、ルックアップ (これまでで最も遅くなる) が遅くなります。共通操作)。

このような 1 対多の関係を MySQL に実装する最も効率的な方法は何でしょうか?それとも、何らかの方法ですべてのデータを直接ファイルシステム上に保持する、あるいは他のストレージ エンジン上に保持する、より健全なソリューションがあるのでしょうか?

役に立ちましたか?

解決

ただ、主テーブルのキー列で、「多くの」のためのテーブルを保持します。

私はあなたが標準的な工業強度リレーショナルDBMSの効率化や容量の制約に実行する前に解決するために、他の多くの重要な問題がたくさんあるでしょうquaranteeます。

(多数の代替製品との)最も可能性の高い第二の選択肢私見ISAMを使用することです。

他のヒント

データに対して深い/再帰的なトラバーサルを行う必要がある場合は、次のようなグラフ データベースを使用します。 Neo4j (私がチームに所属している場所は)良い選択だ。記事内でいくつかの情報が得られます リレーショナル データベースを超えるべきでしょうか? そしてで この投稿は高スケーラビリティにあります. 。あなたと似たようなユースケースについては、これをお読みください MetaFilter のスレッド. 。言語バインディングやその他の情報については、次のリンクも参照してください。 Neo4j ウィキ そして メーリングリスト 役に立つ。

答えが、いくつかの質問と可能なアプローチではないので、多くの....

あなたがテーブルの自己参照を作成し、一方のフィールドのみを使用したい場合は、

...いくつかのオプションがあります。計算されたマスカブルは、フィールドを「参加」お互いに多くの行を関連付ける方法について説明します。

最善の解決策は、おそらくデータとの関係の性質を検討しますか? データと検索の本質とは何ですか?関係のどのようなあなたが含まれているしようとしていますか?協会?関連する?親/子供?

私の最初のコメントを使用すると、データが使用される方法を記述することができます場合は、より良い反応を得るだろうということになりますが、既に説明したものに加えて(、追加/アップデートVSルックアップの頻度の更新など対追加されます)。言われていること、私の最初の考えはただの一般的な表現で行くことになります。


CREATE  TABLE IF NOT EXISTS one_table (
  `one_id` INT UNSIGNED  NOT NULL AUTO_INCREMENT
           COMMENT 'The The ID of the items in the one table' ,
  ... other data
)

CREATE  TABLE IF NOT EXISTS many_table (
  `many_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
            COMMENT 'the id of the items in the many table',
  `one_id` INT UNSIGNED  NOT NULL
           COMMENT 'The ID of the item in the one table that this many item belongs to' ,
  ... other data
)

両方のテーブルにone_idにインデックスを作成するために、当然のことながら、確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top