MySQL: много объединений и отношений в одной таблице (теоретический вопрос)

Это более теоретический вопрос, а не конкретный сценарий:

Предположим, у нас есть упрощенная схема таблицы:

альтернативный текст

items содержит некоторые основные данные, item_data дополнительные свойства для каждого элемента, а rel_items устанавливает древовидную связь между различными элементами. Существуют различные типы элементов (представленные полем items.item_type), которые имеют разные поля, хранящиеся в item_data, например: собака, кошка, мышь.

Если у нас есть несколько более крупных запросов с некоторыми соединениями и соединениями (например, получение элементов с их родительскими элементами, имеющими некоторые условия с другими элементами и т. д.), может ли это стать проблемой производительности по сравнению с разделением всех различных типов элементов на отдельные таблицы (dog , cat, mouse) и не сливая их в один?

Если мы сохраним все это в одной базовой таблице элементов, повлияет ли как-то на производительность создание представлений (собака, кошка, мышь)?

edit (как прокомментировано ниже): я думал о «видах», «домашних питомцах» и т. д. как о item_types. Каждый тип имеет разные свойства. Цель использования базовой таблицы элементов и таблицы item_data состоит в том, чтобы иметь базовый «объект» и прикреплять к ним столько свойств, сколько необходимо, без необходимости изменять схему базы данных. Например, я не знаю, сколько животных будет в приложении и какими свойствами они обладают, поэтому я подумал о схеме базы данных, которую не нужно менять каждый раз, когда пользователь создает новое животное.


person acme    schedule 03.12.2010    source источник
comment
ot: как ты создал этот образ?   -  person Breezer    schedule 03.12.2010
comment
MySQL Workbench (mysql.com/products/workbench) является бесплатным.   -  person acme    schedule 03.12.2010


Ответы (3)


Если у нас есть несколько более крупных запросов с некоторыми соединениями..., может ли это стать проблемой производительности по сравнению с разделением всех различных типов элементов на отдельные таблицы (собака, кошка, мышь) и не объединять их в одну?

No.

Если мы сохраним все это в одной базовой таблице элементов, повлияет ли как-то на производительность создание представлений (собака, кошка, мышь)?

No.

Отдельные таблицы означают, что это принципиально разные вещи — разные атрибуты или разные операции (или оба разные).

Одна и та же таблица означает, что это в основном одно и то же — одни и те же атрибуты и одни и те же операции.

Производительность не является первым соображением.

Смысл — первое соображение.

После того, как вы разберетесь, что это означает, и каковы реальные функциональные зависимости между элементами, вы можете рассмотреть производительность соединения.

«Собака, кошка, мышь» — все млекопитающие. Один стол.

«Собака, кошка, мышь» — это два хищника и одно всеядное. Две таблицы.

«Собака, кошка, мышь» — это два обычных домашних питомца и один обычный вредитель. Две таблицы.

«Собака, кошка, мышь» — это одно крутое животное и два противных. Две таблицы.

«Собака, кошка, мышь» — это три отдельных вида. Три стола.

Это о смысле.

person S.Lott    schedule 03.12.2010
comment
Я думал о видах, домашних питомцах и так далее как о типах предметов. Каждый тип имеет разные свойства. Цель использования базовой таблицы элементов и таблицы item_data состоит в том, чтобы иметь базовый объект и прикреплять к нему столько свойств, сколько необходимо, без изменения схемы базы данных. Например, я не знаю, сколько животных будет в приложении и какими свойствами они обладают, поэтому я подумал о схеме базы данных, которую не нужно менять каждый раз, когда пользователь создает новое животное. (добавил этот текст в исходный пост) - person acme; 03.12.2010
comment
@acme: комментарий и редактирование ничего не меняют. Смысл на первом месте. присоединение к ним столько свойств, сколько необходимо, без изменения схемы базы данных является второстепенным или, возможно, неуместным. Решать проблему. Не пытайтесь изобрести метаобъектную модель в реляционной базе данных. - person S.Lott; 03.12.2010
comment
Я не уверен, действительно ли я понимаю, что вы имеете в виду (возможно, пример с животными не самый лучший). Для меня значение отличается от точки зрения. В одно время необходимо выбирать предметы с видовой точки зрения, в другое время необходимо смотреть на них как на млекопитающих. - person acme; 03.12.2010
comment
@acme: правильно. Решать проблему. Значение зависит от проблемной области и контекста, в котором возникает проблема. Если вы хотите сделать что-то более общее, прекратите использовать реляционную базу данных. Используйте ООБД или, что еще лучше, переключитесь на использование онтологического инструмента, такого как OWL, или что-то еще для получения более общих знаний. - person S.Lott; 03.12.2010
comment
Имеет смысл... Я еще раз изучу ООБД. - person acme; 16.12.2010

Попытка построить схему, которая может вместить новые объекты, не проанализированные и не включенные при проектировании базы данных, — это идея, которая снова и снова возникает при обсуждении реляционных баз данных.

В классическом реляционном моделировании данных отношения могут быть разработаны в свете определенных утверждений, которые должны быть высказаны в отношении обсуждаемой вселенной. Эти предложения представляют собой факты, которые пользователи данных могут получить, извлекая данные из базы данных. Базовые отношения утверждаются путем сохранения чего-либо в базе данных. Производные отношения могут быть получены операциями над базовыми отношениями. Когда база данных SQL создается с использованием реляционной модели данных в качестве ориентира, базовые отношения становятся таблицами, а производные отношения — представлениями.

Но все это предполагает, что атрибуты обнаруживаются во время анализа данных до начала проектирования базы данных.

На практике за последние 25 лет большинство баз данных было создано на основе анализа, который, как позже выяснилось, был неполным или неверным. Затем базы данных пересматриваются в свете нового и улучшенного анализа, а пересмотренная база данных иногда требует обслуживания кода приложения. Безусловно, реляционная модель и базы данных SQL создавали меньше зависимостей приложений, чем дореляционные базы данных.

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

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

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

person Walter Mitty    schedule 03.12.2010
comment
Хорошо, спасибо - так что в целом кажется плохой идеей пытаться сделать схему базы данных как можно более абстрактной. Но кроме каких-либо проблем с производительностью, какие проблемы, о которых вы упомянули, могут возникнуть? - person acme; 03.12.2010
comment
@acme: пытаться сделать схему базы данных как можно более абстрактной - плохая идея. Это ужасная идея. База данных SQL уже является абстракцией, используйте базу данных для решения своей проблемы, а не создавайте новый вид абстракции на основе абстракции SQL. - person S.Lott; 03.12.2010
comment
Проблема 1: Как вы будете представлять отношения «многие ко многим» в своей базе данных? Пример: в системе заказов на продажу отношения между клиентами и продуктами являются многими ко многим. Ваша база данных поддерживает отношения родитель-потомок, но не многие-ко-многим. - person Walter Mitty; 03.12.2010
comment
Проблема 2: если у вас есть несколько пользователей в вашей базе данных, как вы предотвратите синонимы имен данных и имена данных омонимов? А если нет, то как вы будете рисовать выписки, объединяющие данные от разных пользователей? - person Walter Mitty; 03.12.2010
comment
Проблема 3: Как ваша база данных будет представлять даты, чтобы вы могли легко вычислить день недели, интервал между двумя датами и т. д. и т. д. - person Walter Mitty; 03.12.2010
comment
Проблема 4: Как ваша база данных предотвратит ввод одного и того же факта дважды? Или, если вы позволите это, как вы предотвратите отбрасывание ваших отчетов, когда они берут агрегаты? - person Walter Mitty; 03.12.2010
comment
Проблема 5: Я думаю, вы поняли идею. Все инструменты управления данными, которым обычно помогает СУБД, теперь снова в руках программиста. С таким же успехом вы можете хранить данные в файлах. - person Walter Mitty; 03.12.2010

Конечно, доступ к данным в объединенной таблице всегда БУДЕТ медленнее. Но с правильными индексами это может быть приемлемым замедлением (например, в 2 раза).

Я бы переместил общие элементы, которые вы используете в запросах, в таблицу элементов и оставил в item_data только значения, которые вам нужно отображать, которые не используются в условиях WhERE и JOIN.

person BarsMonster    schedule 03.12.2010
comment
2x - это предположение, которое я предполагаю? Я не думаю, что обычно это так много ... Но, как всегда с вопросами о производительности: не угадывайте, а измеряйте, все остальное почти гарантированно доставит вам неприятности когда-нибудь в будущем. - person Daniel Schneller; 03.12.2010
comment
Слово «нравится» предполагает, что это приблизительная оценка. Наверняка бенчмарк покажет правду :-) - person BarsMonster; 06.12.2010