В дизайне таблицы базы данных, который из следующего является лучшим дизайном для типа событийного журнала роста данных
Дизайн 1) Числовые столбцы (Long) и столбцы символов (Varchar2) с индексом:
..(pkey)|..|..|StockNumber Long | StockDomain Varchar2 |...
.. |..|..|11111 | Finance
.. |..|..|23458 | Medical
Дизайн 2) Символьная колонка Varchar2 с индексом:
..(pkey)|..|..|StockDetails Varchar2(1000) |..|..
.. |..|..|11111;Finance |..|..
.. |..|..|23458;Medical |..|..
Преимущества дизайна: Первый дизайн очень специфичен, а второй дизайн более общий, который может вместить более общие данные. В обоих случаях индексируются столбцы.
Хранение: для первых индексов дизайна требуется меньше памяти, чем вторая. Производительность: одинаково?
У меня вопрос о производительности и гибкости. Очевидно, что первый дизайн лучше. Но второй дизайн - это более общая цель. Дайте мне знать ваши идеи
Примечание. Отредактирован вопрос для большей ясности.
В общем, наличие дискретных столбцов - лучший способ пойти по нескольким причинам:
Типы данных. У вас есть гарантии, что сохраненные вами данные находятся в правильных форматах, по крайней мере, до тех пор, пока не будут столбцы, отличные от строки, ваш запасной номер всегда будет числом, если он имеет значение bigint/long, пытаясь установить его на что угодно, ваша вставка/обновление до ошибки. Как часть строки с разделителем двоеточия (CSV) существует вероятность появления плохих данных, когда она является частью строки.
Querying - запрос одного столбца должен выполняться с использованием LIKE
поскольку вы ищете подстроку одной строки столбца. Если я ищу WHERE StockDetails LIKE '%11111%'
я найду первую строку, но я могу найти другую строку, где значение доллара внутри этого столбца в другом поле равно $ 11111. С дискретными столбцами ваш запрос будет WHERE StockNumber = 11111
гарантирующий, что он найдет данные только в этом столбце.
Использование данных. После того, как вы нашли нужную строку, вам необходимо прочитать данные. Это означает разбор CSV на отдельные поля. Если в одном из этих полей есть двоеточие, и это неправильно экранировано, остальные данные будут проанализированы неправильно, и вам все равно понадобятся ваши значения в том же порядке, оставив пустые разделы ;;
где у вас было бы нулевое значение в столбце.
Между хранением CSV и отдельными столбцами существует промежуточная точка. Я видел и фактически делаю на одном крупном проекте данные, хранящиеся в таблице как json. С json у вас есть имена свойств, поэтому вам неважно, как появятся поля в строке, потому что домен будет всегда быть доменом, любые нестандартные поля, которые вам не нужны в записи (скажем, свойство, которое существует только для медицинский домен) просто не будет там, а не нужен пустой двойной двоеточие, а парсеры для json существуют на всех языках, я могу думать о том, что вы подключаетесь к своей базе данных, нет необходимости вручную кодировать что-то, чтобы проанализировать вашу строку CSV, Например, приведенные выше данные StockDetails будут выглядеть так:
+--------------------------------------+
| StockDetails |
+--------------------------------------+
| {"number":11111, "domain":"Finance"} |
| {"number":23458, "domain":"Medical"} |
+--------------------------------------+
Это решает проблемы 2 и 3 выше:
WHERE StockDetails LIKE '%"number":11111
включая имя свойства json, гарантирует, что вы не найдете данные нигде в своей строке.В структуре реляционных баз данных вам нужны отдельные столбцы. Одно значение за столбец за строку.
Это единственный способ использовать типы данных и ограничения для реализации некоторой целостности данных. В вашем втором дизайне, как бы вы реализовали ограничение UNIQUE на StockNumber или StockDomain? Как бы вы могли убедиться, что StockNumber на самом деле является номером?
Это единственный способ создать индексы для каждого столбца в отдельности или создать составной индекс, который сначала помещает StockDomain.
Как аналогию, посмотрите в телефонной книге: можете ли вы найти всех людей, чье имя "Билл" легко или эффективно? Нет, вам нужно искать всю книгу, чтобы найти людей с определенным именем. Порядок столбцов в индексе имеет значение.
Второй дизайн практически не является базой данных - это файл.
Чтобы ответить на ваши комментарии, я повторяю то, что я написал в комментарии:
Иногда денормализация стоит того, но я не могу сказать [если ваш второй проект стоит], потому что вы не описали, как вы будете запрашивать эти данные. Вы должны принять во внимание ваши запросы, прежде чем сможете решить любую оптимизацию.
Иными словами: денормализация, как и все другие оптимизации, приносит пользу одному типу запроса за счет других типов запросов. Поэтому вам нужно знать, какие запросы вам нужны, чтобы быть оптимальными, а какие запросы менее важны, поэтому это не повредит вашей общей производительности, если другие запросы будут ухудшены.
Если вы не можете предсказать запросы, по умолчанию создайте базу данных с нормализацией. Нормализация не предназначена для оптимизации производительности, она предназначена для предотвращения аномалий данных, что также является хорошей целью.
Вы опубликовали несколько новых комментариев, я думаю, в надежде, что я вдруг пойму и одобрю ваш второй дизайн. Но вы все еще не описали какой-либо конкретный запрос, который будет оптимизирован, используя ваш второй дизайн.