Я создаю базу данных на MySQL для небольшого приложения.
Проблема в том, что слишком много полей одинаковы в разных таблицах, например
Таблица 1: Проблемы Muncipal:
Я БЫ,
Идентификатор пользователя,
Заглавие,
Место нахождения,
Описание,
URL изображения,
Таблица 2: Проблемы с притяжением:
Я БЫ ,
Идентификатор пользователя,
Заглавие,
Место нахождения,
Описание,
URL изображения
Таблицы 3 такие же, как выше
оба стола имеют почти одинаковые номера.
Я хочу спросить, лучше ли использовать отношения и создать таблицу для обработки идентификаторов и связать ее с другими деталями, или лучше создать единую таблицу с дополнительным списком для этих проблем.
с одной стороны, будет слишком много таблиц с одинаковыми столбцами.
с другой стороны, там будет несколько таблиц с большим количеством строк.
Что будет лучше для производительности больше строк или больше таблиц.
Я использую Mysql.
Во-первых, если вы не ожидаете, что миллионы записей будут заботиться не столько о производительности, сколько о структуре ваших данных и о том, как легко будет получить к ним доступ. Буквально запишите список данных, которые вы планируете извлечь в вашем приложении, например. «найти все проблемы сегодня», «найти все нерешенные проблемы старше 6 месяцев», а затем попытаться построить реальные запросы SQL на ожидаемой структуре. Если они идут усердно, попробуйте изменить структуру.
Чтобы ответить на ваш вопрос: это зависит. Текущая структура имеет следующие преимущества:
и следующие недостатки:
UNION
-s. Более того это UNIONS
потребует создания виртуального поля с типом проблемы, иначе вы не сможете определить, из какой таблицы пришел определенный идентификатор.Классический подход БД рекомендует использовать одну таблицу для общих полей и создавать производные таблицы для полей, которые отличаются. Так:
issues
таблица должна иметь все общие поля и идентифицируется по PK issue_id
municipal_issues
использует внешний ключ для issues.issue_id
и имеет только определенные поля harassment_issues
использует внешний ключ для issues.issue_id
и имеет только определенные поляissues
стол имеет issue_type
поле, которое принимает значения «домогательство», «муниципальный» и т. д. и помогает найти таблицу, в которой хранятся дополнительные данные.Эта картина называетсяНаследование таблицы классов«и вы можете проверить Антипаттерны SQL презентация для получения дополнительной информации и других подходов. Это решает проблему гибкости и по-прежнему позволяет воссоздавать каждую из исходных таблиц только с одним простым JOIN, который выполняется довольно быстро.
Также в качестве примечания вы можете посмотреть на схему БД для трекеров ошибок, таких как Богомол так как это выглядит как один и тот же домен.
Других решений пока нет …