T SQL Дизайн таблицы: как представить категорию «причина нулевого значения» в таблице базы данных? - PullRequest
0 голосов
/ 26 мая 2020

Я прошу совета или мыслей о том, как лучше всего представить следующее требование клиента. Это довольно длинный пост, так что надеюсь, что это правильный форум - буду рад поправкам, если есть место получше.

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

Исходные данные

  • Я получаю различные исходные «наборы данных» в виде json, которые необходимо хранить в реляционных таблицах (SQL Сервер).
  • Каждый набор данных вложен, но не слишком глубоко, и логически он выглядит как строки и столбцы (или файл csv)
  • В день будет примерно 500 000 строк добавлено:
  • Каждый набор данных имеет разное количество столбцов по сравнению с другим набором данных (но каждый набор данных исторически согласован). В одном наборе данных может быть до 50 столбцов данных.
  • Данные каждого столбца / атрибута могут иметь разные типы данных, например nvarchar, integer, DateTime и т. Д. c
  • Некоторые данные столбца / атрибута имеет законное значение null, но есть записанная « причина для нуля »
    • Not null (у нас есть допустимое значение)
    • Unknown (нормальное нулевое значение)
    • не будет известно до даты в будущем
    • ожидает ответа
  • Многие столбцы в одной таблице набора данных имеют параметр «причина для нуля»

Мысли о техническом дизайне

1) Первый вариант дизайна на основе столбцов

  • Каждый «данные» столбец может иметь вторичный столбец «причина пустого». Обратной стороной является то, что мы удваиваем количество столбцов в таблице.
  • Таблица, содержащая данные и «причину нулевых» данных
  • Таблица для определений «Причина отсутствия значения» - т.е. для отношений внешнего ключа

т.е.


CREATE TABLE dbo.DataSet1
(
    [RowID]         BIGINT IDENTITY(1,1) NOT NULL,
    [DataAttribute01] NVARCHAR (128) NULL,
    [DataAttribute01_ReasonForNull] TINYINT NOT NULL, -- FK to dbo.ReasonForNullCategoryType
    [DataAttribute02] DateTime NULL,
    [DataAttribute02_ReasonForNull] TINYINT NOT NULL, -- as above comment
    [DataAttribute03] UNIQUEIDENTIFIER NULL,
    [DataAttribute03_ReasonForNull] TINYINT NOT NULL, -- as above comment
    [DataAttribute03] [money] NULL,
    [DataAttribute03_ReasonForNull] TINYINT NOT NULL, -- as above comment
)


CREATE TABLE dbo.ReasonForNullCategoryType
(
    [ReasonForNullCategoryTypeID]   TINYINT NOT NULL,
    [ReasonForNullCategoryTypeName] NVARCHAR (128) NULL,

)

INSERT INTO dbo.ReasonForNullCategoryType([ReasonForNullCategoryTypeID],[ReasonForNullCategoryTypeName]) VALUES(1, 'Not Null - a Legitimate Value')
INSERT INTO dbo.ReasonForNullCategoryType([ReasonForNullCategoryTypeID],[ReasonForNullCategoryTypeName]) VALUES(2, 'Null Value')
INSERT INTO dbo.ReasonForNullCategoryType([ReasonForNullCategoryTypeID],[ReasonForNullCategoryTypeName]) VALUES(3, 'Won't be known until a future date')
INSERT INTO dbo.ReasonForNullCategoryType([ReasonForNullCategoryTypeID],[ReasonForNullCategoryTypeName]) VALUES(4, 'Waiting for a response')


2) Вариант дизайна на основе столбцов Два

  • Одна таблица для данные
  • Одна таблица для данных «причина нулевого значения»

т.е.

CREATE TABLE dbo.DataSet1
(
    [RowID]         BIGINT IDENTITY(1,1) NOT NULL,
    [DataAttribute01] NVARCHAR (128) NULL,
    [DataAttribute02] DateTime NULL,
    [DataAttribute03] UNIQUEIDENTIFIER NULL,
    [DataAttribute03] [money] NULL,
)

CREATE TABLE dbo.DataSet1_ReasonForNull
(
    [RowID]         BIGINT NOT NULL, -- same Id as in dbo.DataSet1 table
    [DataAttribute01_ReasonForNull] TINYINT NOT NULL, -- FK to dbo.ReasonForNullCategoryType
    [DataAttribute02_ReasonForNull] TINYINT NOT NULL, -- as above comment
    [DataAttribute03_ReasonForNull] TINYINT NOT NULL, -- as above comment
    [DataAttribute03_ReasonForNull] TINYINT NOT NULL, -- as above comment
)


3) Построчное исполнение

Каждый столбец «данных» может быть представлен как отдельная строка, со столбцами для имени атрибута, причина для нулевого значения имеет вторичный столбец «причина для нулевого».

Недостатки:

  • заключается в том, что мы значительно увеличиваем количество строк на загрузку набора данных.
  • нам нужно представить разные типы данных как один тип
  • обеспечение правильного количества строк в строке набора данных
    • т.е. количество SQL строк должно быть таким же, как количество столбцов «строк» ​​набора данных
  • потеря точности данных десятичного типа, если они представлены в виде строки
CREATE TABLE dbo.DataSet1
(
    [RowID]         BIGINT IDENTITY(1,1) NOT NULL,
    [DataAttributeName] NVARCHAR (128) NOT NULL,
    [DataAttributeValue] NVARCHAR (1024) NULL,
    [ReasonForNull] TINYINT NOT NULL, -- FK to dbo.ReasonForNullCategoryType table
)

Поиск данных

  • Требуется может отвечать на вопросы о данных.
  • Сумма столбцов [Money] для каждой загрузки набора данных
  • Подсчитать количество «Reason For Null» (как общее количество на загрузку набора данных)
  • Подсчитайте количество «Причин нулевого значения» в столбце
    • Сколько «ожидающих ответа» причин для столбца DataAttribute01 и т. Д. c
    • повторить для других «причин»

Любые мысли очень ценятся. Я больше склоняюсь к варианту 1, но я уверен, что есть довольно много вариантов, о которых я просто не думал, а есть у кого-то другого!

Спасибо.

...