Одиночный столбец против многоколоночного дизайна (для столбцов без первичного ключа)

0

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

Дизайн 1) Числовые столбцы (Long) и столбцы символов (Varchar2) с индексом:

..(pkey)|..|..|StockNumber Long | StockDomain Varchar2 |...
..      |..|..|11111            | Finance
..      |..|..|23458            | Medical

Дизайн 2) Символьная колонка Varchar2 с индексом:

..(pkey)|..|..|StockDetails  Varchar2(1000) |..|..
..      |..|..|11111;Finance                |..|.. 
..      |..|..|23458;Medical                |..|..

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

Хранение: для первых индексов дизайна требуется меньше памяти, чем вторая. Производительность: одинаково?

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

Примечание. Отредактирован вопрос для большей ясности.

  • 5
    Преимущества использования одного столбца таковы: никогда не используйте один столбец. Надеюсь это поможет.
  • 0
    Если вы используете систему баз данных, такую как Oracle, вы должны хранить ее в правильном формате, то есть отдельно. В противном случае вам лучше использовать плоский файл (или Hadoop). Когда вы думаете, что # 2 является более общим, вы, наконец, закончите со всеми данными в одной таблице :-)
Показать ещё 3 комментария
Теги:
database-design
nosql

2 ответа

2
Лучший ответ

В общем, наличие дискретных столбцов - лучший способ пойти по нескольким причинам:

  1. Типы данных. У вас есть гарантии, что сохраненные вами данные находятся в правильных форматах, по крайней мере, до тех пор, пока не будут столбцы, отличные от строки, ваш запасной номер всегда будет числом, если он имеет значение bigint/long, пытаясь установить его на что угодно, ваша вставка/обновление до ошибки. Как часть строки с разделителем двоеточия (CSV) существует вероятность появления плохих данных, когда она является частью строки.

  2. Querying - запрос одного столбца должен выполняться с использованием LIKE поскольку вы ищете подстроку одной строки столбца. Если я ищу WHERE StockDetails LIKE '%11111%' я найду первую строку, но я могу найти другую строку, где значение доллара внутри этого столбца в другом поле равно $ 11111. С дискретными столбцами ваш запрос будет WHERE StockNumber = 11111 гарантирующий, что он найдет данные только в этом столбце.

  3. Использование данных. После того, как вы нашли нужную строку, вам необходимо прочитать данные. Это означает разбор CSV на отдельные поля. Если в одном из этих полей есть двоеточие, и это неправильно экранировано, остальные данные будут проанализированы неправильно, и вам все равно понадобятся ваши значения в том же порядке, оставив пустые разделы ;; где у вас было бы нулевое значение в столбце.

Между хранением CSV и отдельными столбцами существует промежуточная точка. Я видел и фактически делаю на одном крупном проекте данные, хранящиеся в таблице как json. С json у вас есть имена свойств, поэтому вам неважно, как появятся поля в строке, потому что домен будет всегда быть доменом, любые нестандартные поля, которые вам не нужны в записи (скажем, свойство, которое существует только для медицинский домен) просто не будет там, а не нужен пустой двойной двоеточие, а парсеры для json существуют на всех языках, я могу думать о том, что вы подключаетесь к своей базе данных, нет необходимости вручную кодировать что-то, чтобы проанализировать вашу строку CSV, Например, приведенные выше данные StockDetails будут выглядеть так:

+--------------------------------------+
|             StockDetails             |
+--------------------------------------+
| {"number":11111, "domain":"Finance"} |
| {"number":23458, "domain":"Medical"} |
+--------------------------------------+

Это решает проблемы 2 и 3 выше:

  1. Теперь вы пишете свой запрос как WHERE StockDetails LIKE '%"number":11111 включая имя свойства json, гарантирует, что вы не найдете данные нигде в своей строке.
  2. Вам не нужно беспокоиться о том, что поля вышли из строя или отсутствуют в вашей строке, из-за чего ваши данные будут непригодными для использования, поскольку json дает вам пару ключ/значение, все, что вам нужно сделать, это обработать нули, где ключ не существует, Это также позволяет легко добавлять поля, добавляя новое поле CSV, чтобы разбить ваш код на синтаксический анализ, количество значений будет отключено для ваших существующих данных, поэтому вам нужно будет обновлять все строки потенциально, однако, поскольку в json вы только сохраняете non null fields, новое поле будет рассматриваться как любое другое нулевое значение для существующих данных.
  • 0
    Привет Андрей, спасибо за ответ. Пожалуйста, вернитесь к моему вопросу. У меня есть несколько правок. Я не понимал, что мой вопрос имеет неоднозначное значение. Столбцы, которые я упомянул, являются тривиальными в моем требовании
  • 0
    Эндрю, мне нравится твой мыслительный процесс. Json очень эффективен для структурированных данных. CSV также является полуструктурированными данными для нетривиальных столбцов, а длина строки имеет значение для индексированных данных. Очень консервативен в отношении длины столбца (едва ли 1000 символов). Исключение реляционных внешних ключей может сделать таблицы легкими и универсальными. Отличный ответ. Большое спасибо. После ознакомления с проектами данных NoSQL / Bigdata (Domain Driven Designs) я заново изучаю свои знания по проектированию схем баз данных. Фокус для простоты, а не сложности.
Показать ещё 3 комментария
2

В структуре реляционных баз данных вам нужны отдельные столбцы. Одно значение за столбец за строку.

Это единственный способ использовать типы данных и ограничения для реализации некоторой целостности данных. В вашем втором дизайне, как бы вы реализовали ограничение UNIQUE на StockNumber или StockDomain? Как бы вы могли убедиться, что StockNumber на самом деле является номером?

Это единственный способ создать индексы для каждого столбца в отдельности или создать составной индекс, который сначала помещает StockDomain.

Как аналогию, посмотрите в телефонной книге: можете ли вы найти всех людей, чье имя "Билл" легко или эффективно? Нет, вам нужно искать всю книгу, чтобы найти людей с определенным именем. Порядок столбцов в индексе имеет значение.

Второй дизайн практически не является базой данных - это файл.


Чтобы ответить на ваши комментарии, я повторяю то, что я написал в комментарии:

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

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

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


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

  • 0
    Билл Карвин, спасибо за быстрый ответ. Я отредактировал вопрос для большей ясности. Столбцы, которые я упомянул, тривиальны, но таблица общего назначения имеет некоторые преимущества с нетрадиционно растущими данными. Извините за правки, но я не понял, что в моем вопросе есть неоднозначные детали. По вашему опыту, что такое хорошее использование столбца с текстом и индексированием? Индексированные столбцы имеют O (log (n)) производительность поиска в худшем случае. Колонизация всех данных - это то, чего я пытаюсь избежать.
  • 1
    Иногда стоит денормализовать, но я не могу сказать, потому что вы не описали, как вы будете запрашивать эти данные. Вы должны принять во внимание ваши запросы, прежде чем вы сможете принять решение о какой-либо оптимизации.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню