スケーラブルな 1 対多のテーブル (MySQL)
-
12-09-2019 - |
質問
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にインデックスを作成するために、当然のことながら、確認します。