Должен ли я использовать плоские таблицы или нормализованную базу данных?

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

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

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

Очевидно, что некоторые положительные стороны создания плоских таблиц - это разделение данных (безопасность), и скорость запросов будет сокращена. Но серьезно, сколько я получу от этого? Мне действительно не нужны 10000 таблиц, и я все время отбрасываю, изменяю и добавляю все, но если это будет лучше, чем я это сделаю... Мне просто нужен какой-то ввод.

Спасибо

Ответы

Ответ 1

Общее правило. Легче перейти от нормализованного к денормализованному, чем наоборот.

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

Ответ 2

Сохраняйте нормализацию данных. Если вы правильно указали, вы не столкнетесь с проблемами производительности в течение очень долгого времени.

Что касается безопасности: для плоского подхода вам потребуется написать много команд create/drop table, alter table etc, т.е. намного больше кода и намного больше ошибок.

Единственная причина иметь плоские файлы - это когда ваши пользователи могут напрямую подключаться к БД (вы все равно можете пойти на уровень безопасности на уровне строк). Но в этом случае вы действительно переопределяете вариант phpmyadmin

Ответ 3

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

Хлоп! Тогда как вы могли бы делать какие-либо нормализации, когда пользователи, в сущности, принимают решения по базе данных для вас.

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

Ответ 4

Изменение схемы во время выполнения редко является хорошей идеей. Вы хотите рассмотреть модель EAV (Entity-Attribute-Value).

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

Ответ 5

Сохраняйте нормализацию данных. Система будет оставаться быстрой, если у вас есть правильная индексация.

Если вы действительно хотите быстро перейти, переключите схему в одну из баз данных ключевых значений, таких как bigDB/couchDB и т.д. Это полностью денормализировано и очень быстро.

Ответ 6

То, как я бы справился с этим, - использовать нормализованную расширяемую таблицу "Свойство", например, ниже:

Table: FormProperty
 id: pk
 form_id: fk(Form)
 key: varchar(128)
 value: varchar(2048)

Вышеприведенное является лишь примером, но во многих случаях я использовал этот шаблон, и он имеет тенденцию работать довольно хорошо. Единственное реальное "получение" - это то, что вам нужно сериализовать значение как строку /varchar, а затем десериализовать его на все, что должно быть, поэтому на клиенте есть небольшая дополнительная ответственность.

Ответ 7

Нормализованный == быстрый поиск, упрощает ведение индексов, более медленные транзакции вставки (на несколько строк)

Денормализованные == быстрые вставки, обычно это используется, когда имеется много вложений (хранилища данных, которые собирают и записывают хронологические данные)