Масштабируемая таблица «один ко многим» (MySQL) - PullRequest
0 голосов
/ 12 июля 2009

У меня есть база данных MySQL, и определенная таблица в этой базе данных должна быть самообращающейся в виде «один ко многим». Для масштабируемости мне нужно найти максимально эффективное решение. Два наиболее очевидных для меня пути:

1) Добавить текстовое поле в таблицу и сохранить там сериализованный список первичных ключей

2) Сохраните таблицу компоновщика, где каждая строка будет однозначной.

В случае № 1 я вижу, что таблица очень сильно расширяется (используя пространственную аналогию), но в случае № 2 я вижу, что таблица компоновщиков увеличивается до очень большого числа строк, что замедляет поиск далеко самая распространенная операция).

Каким самым эффективным способом реализовать такое отношение «один ко многим» в MySQL? Или, может быть, есть более разумное решение, которое каким-то образом хранит все данные непосредственно в файловой системе, или какой-то другой механизм хранения?

Ответы [ 4 ]

1 голос
/ 13 июля 2009

Если вам нужно сделать глубокие / рекурсивные обходы данных, лучше всего подойдет графическая база данных типа Neo4j (где я в команде). Некоторую информацию вы найдете в статье Стоит ли вам выходить за рамки реляционных баз данных? и в это сообщение о высокой масштабируемости . Для случая использования, который может быть похож на ваш, прочитайте эту ветку на MetaFilter . Для получения информации о языковых привязках и других вещах вы также можете найти полезными Neo4j wiki и список рассылки .

1 голос
/ 12 июля 2009

Просто сохраните таблицу для «многих» с ключевым столбцом для первичной таблицы.

Я гарантирую, что у вас будет множество других более важных проблем, которые необходимо решить, прежде чем вы столкнетесь с ограничениями по эффективности или емкости в стандартных реляционных дБм промышленного уровня.

ИМХО наиболее вероятным вторым вариантом (с многочисленными альтернативными продуктами) является использование исама.

0 голосов
/ 12 июля 2009

Не столько ответ, сколько несколько вопросов и возможный подход ...

Если вы хотите сделать таблицу самоссылочной и использовать только одно поле ... есть несколько вариантов. Вычисляемое маскируемое поле 'join' описывает способ связать множество строк друг с другом.

Лучшее решение, вероятно, будет учитывать характер данных и отношений? Какова природа данных и поисков? Какие отношения вы пытаетесь сдержать? Ассоциация? Связанные с? Родитель / Дети

0 голосов
/ 12 июля 2009

Моим первым комментарием будет то, что вы получите лучшие ответы, если сможете описать, как будут использоваться данные (частота добавления / обновления или поиска, добавления или обновления и т. Д.) В дополнение к тому, что вы уже описали. При этом моей первой мыслью было бы просто использовать общее представление


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 в обеих таблицах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...