Я прошу совета или мыслей о том, как лучше всего представить следующее требование клиента. Это довольно длинный пост, так что надеюсь, что это правильный форум - буду рад поправкам, если есть место получше.
Есть несколько способов, которыми я думал о техническом решении этого требования, но я пытаюсь найти эффективный способ, потому что по большей части каждый из них кажется компромиссом.
Исходные данные
- Я получаю различные исходные «наборы данных» в виде 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, но я уверен, что есть довольно много вариантов, о которых я просто не думал, а есть у кого-то другого!
Спасибо.