#database #normalization
#База данных #нормализация
Вопрос:
У меня есть электронная таблица Excel, которую я собираюсь превратить в базу данных для сбора данных и создания интерактивного приложения. Имеется около 20 столбцов и 80 000 записей. Практически во всех записях около половины данных их столбцов имеют значение null, но данные, содержащиеся в столбце, являются случайными для каждой записи.
Варианты могут заключаться в:
-
Создайте более нормализованную базу данных с таблицей для каждого столбца и используйте 20 объединений для просмотра всех данных. Я бы подумал, что преимуществами была бы база данных, в которой на самом деле нет нулевых значений, поэтому размер был бы меньше. Одним из основных недостатков было бы больше кода для обновления каждой таблицы со стороны приложения.
-
Создайте плоский файл с одной таблицей, содержащей все столбцы. Я полагаю, что прикладной стороне будет проще выполнять обновления, но в результате таблица будет загружена в пустое пространство данных.
Комментарии:
1. Какая связь между «множеством нулевых полей» и нормализацией? Если у вас есть 80.000 разных программистов базы данных (идентифицируемых по их номеру социального страхования) и 20 столбцов за дни 1/1/2011 … 1/20/2011, чтобы указать, нормализовали ли они свою базу данных в этот день, у вас есть идеальная — хотя и разреженная — таблица. Для оптимизации хранилища вам понадобится одна (а не двадцать) таблица (ssn, дата).
Ответ №1:
Я не понимаю, почему вы думаете, что обновить нормализованную базу данных сложнее, чем плоскую таблицу. Все как раз наоборот.
Подумайте о том, чтобы вставить связь между клиентом и продуктом (в основном заказом). Вам пришлось бы:
- выберите строку, которая описывает остальные данные, но имеет нули или что-то в столбцах product
- вы должны обновить столбцы продукта
- вам нужно вставить ОГРОМНУЮ строку в базу данных
Как насчет первого раза? Что вы делаете с начальными значениями null? Вы изменяете свои выборки, чтобы игнорировать их? Что, если вам нужны значения null?
Что, если вы удалите последний продукт? Вы меняете ее на обновление и устанавливаете нули только для нескольких столбцов?
Помимо объединений, работа с нормализованной таблицей тривиальна по своей конструкции. Вы платите за ее тривиальность производительностью, это фактический компромисс.
Комментарии:
1. Я не думаю, что это было бы сложнее, я просто думаю, что потребовалось бы больше кодирования с выполнением обновления для каждого столбца отдельно вместо одной строки для обновления строки большего размера. Тогда возникает вопрос, приведет ли большее кодирование к замедлению работы приложения или более крупная база данных сделает приложение медленнее.
2. @sfreelander, ты все еще задаешь неправильный вопрос. Практически невозможно, чтобы ненормализованная база данных была лучше, чем нормализованная для всего приложения . Однако кластеры больших данных, такие как Google, денормализуют свои базы данных для запросов каждые пару часов, но сохраняют свою основную базу данных нормализованной для вставок сканера. Таким образом, они получают лучшее из обоих миров.
3. @sfreelander: Каноническая модель для приложения — хороший способ избежать ненужных сложностей. Смотрите CQRS, DDD и другие идеи поверх OO. Единая модель подходит для приложений с активным типом записи, использующих CRUD-манипуляции типа «формы поверх данных». Поведение — это то, где сосредоточена нетривиальная система. Принуждать ее к одной модели недальновидно. Но в этом случае система может быть довольна одной моделью, особенно если все это CRUD. Так что не бойтесь денормализовать, просто убедитесь, что вы делаете это не просто из лени.
Ответ №2:
Если вы собираетесь использовать реляционную базу данных, вам следует нормализовать свои таблицы, хотя бы для того, чтобы упростить обслуживание данных и убедиться, что у вас нет дублирующихся данных.
Вы можете изучить возможность использования базы данных документов для хранения вместо реляционной базы данных, хотя это не единственный вариант.
Комментарии:
1. 1: Простота использования, как правило, зависит от привычки, которая на самом деле не должна быть решающим фактором в том, как подходить к вещам.
Ответ №3:
Как правило, для нормализованных баз данных в конечном итоге будет проще писать код, поскольку SQl-код разработан с учетом нормализованных таблиц.
Комментарии:
1. @adymitruk, ваш комментарий не имеет смысла и ясно показывает ваше невежество в программировании баз данных.
Ответ №4:
Нормализацию необязательно выполнять для всех столбцов, так что есть промежуточный вариант между двумя представленными вами вариантами. Хорошее эмпирическое правило заключается в том, что если у вас есть столбцы, значения которых часто повторяются в разных записях, они могут быть хорошими кандидатами для нормализации в одну или несколько отдельных таблиц. Помещение каждого столбца в отдельную таблицу и объединение между ними почти наверняка является переусердствованием.
Ответ №5:
Не нормализуйте слишком сильно. Трудно поддерживать каноническую модель по мере роста вашего приложения. Хранилище стоит дешево. Не поддавайтесь обману, заставляя кодировать головную боль из-за опасений, которые были актуальны 20 лет назад. Не нужно переходить на nosql, если вам это не нужно.
Комментарии:
1. Нормализация касается не только места для хранения. Это также касается целостности данных. Чем больше вы дублируете данные, тем проще для данных выйти из синхронизации — и к тому времени, когда это происходит, становится занозой в заднице, чтобы попытаться выяснить, какие данные являются действительными.
2. Не совсем. Дублирование необходимо для хранения нескольких моделей. Втискивание множества проблем в одну модель.
3. В любом случае, это звучит как ужасная идея.