Какой из четырех дизайнов, обозначенных в этом вопросе, даст наилучшее время для ВСТАВКИ? - PullRequest
0 голосов
/ 24 февраля 2019

Какая из следующих четырех конструкций баз данных дала бы мне лучшее время вставки?

Конструкция 1

ActivityType
--------------
Id  -- (int primary key identity(1, 1))
ShortName -- (For e.g. 'Biking', 'Jogging', 'Singing', etc.)
ActivityDetailTableName -- ('Biking', 'Jogging', 'Singing', etc. Please 
                        --   see the activity detail tables below)


ActivityLog
------------
Id
ActivityTypeId
DateTimeWhenItHappened
ActivityDetailId NOT NULL -- The Id of the Biking or Jogging or Singing tables

ACTIVITY DETAIL TABLES

Biking
-------
Id
WhoWasBiking
ForHowLong
WhatBike
Color

Jogging
--------
Id
WhoWasJogging
ForHowLong
WhatShoesWereTheyWearing

Singing
--------
Id
WhoWasSinging
WhichSong

Примечания

Обратите внимание, что в Design 1 у меня есть поле внешнего ключа с именем ActivityDetailId в таблице ActivityLog.

В этом проекте, когда происходит какое-либо действие, я будусначала вставьте строку в одну из таблиц подробностей действий, получите их Id и вставьте строку в 'ActivityLog table with the 'ActivityDetailId в качестве идентификатора вновь созданной строки в соответствующей таблице подробностей действий.

Дизайн 2

ActivityType
--------------
Id  -- (int primary key identity(1, 1))
ShortName -- (For e.g. 'Biking', 'Jogging', 'Singing', etc.)
ActivityDetailTableName -- ('Biking', 'Jogging', 'Singing', etc. Please 
                        --   see the activity detail tables below)


ActivityLog
------------
Id
ActivityTypeId
DateTimeWhenItHappened
ActivityDetailId NULL


ACTIVITY DETAIL TABLES

Biking
-------
Id
WhoWasBiking
ForHowLong
WhatBike
Color
ActivityLogId

Jogging
--------
Id
WhoWasJogging
ForHowLong
WhatShoesWereTheyWearing
ActivityLogId

Singing
--------
Id
WhoWasSinging
WhichSong
ActivityLogId

Примечания

Обратите внимание, что в этом дизайне, как и в Дизайн 1 , здесь, в Дизайн 2 , я сохранил поле ActivityDetailId в таблице ActivityLog.Однако на этот раз это поле можно обнулять.

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

Чтобы вставить строку в этот дизайн, когда происходит новое действие, я сначала вставлю новую строку в таблицу ActivityLog, вставив значение NULL в столбец ActivityDetailId.

Затем явставит новую строку в соответствующие таблицы сведений о действиях, правильно вставив ActivityLogId, а затем вернется к вновь вставленной строке в таблицах ActivityLog и обновит значение ActivityDetailId.

Дизайн 3

ActivityType
--------------
Id  -- (int primary key identity(1, 1))
ShortName -- (For e.g. 'Biking', 'Jogging', 'Singing', etc.)
ActivityDetailTableName -- ('Biking', 'Jogging', 'Singing', etc. Please 
                        --   see the activity detail tables below)


ActivityLog
------------
Id
ActivityTypeId
DateTimeWhenItHappened

ACTIVITY DETAIL TABLES

Biking
-------
Id
WhoWasBiking
ForHowLong
WhatBike
Color
ActivityLogId

Jogging
--------
Id
WhoWasJogging
ForHowLong
WhatShoesWereTheyWearing
ActivityLogId

Singing
--------
Id
WhoWasSinging
WhichSong
ActivityLogId

Примечания

Обратите внимание, что в Дизайн 3 я удалил ActivityDetailId изActivityLog таблица.Только таблицы сведений о действиях имеют ссылку на таблицу ActivityLog, поскольку в каждой из них хранится ActivityLogId.

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

Дизайн 4

ActivityType
--------------
Id  -- (int primary key identity(1, 1))
ShortName -- (For e.g. 'Biking', 'Jogging', 'Singing', etc.)
ActivityDetailTableName -- ('Biking', 'Jogging', 'Singing', etc. Please 
                        --   see the activity detail tables below)


ActivityLog
------------
Id
ActivityTypeId
DateTimeWhenItHappened


ACTIVITY DETAIL TABLES

Biking
-------
Id
WhoWasBiking
ForHowLong
WhatBike
Color

Jogging
--------
Id
WhoWasJogging
ForHowLong
WhatShoesWereTheyWearing

Singing
--------
Id
WhoWasSinging
WhichSong


ActivityActivityDetail
------------------------
ActivityId
ActivityDetailId

Примечания

В Design 4 ни таблицы ActivityLog, ни таблицы сведений о действиях не имеют внешнего ключа.Вместо этого есть таблица ссылок с именем ActivityActivityDetail, которая имеет составной первичный ключ, состоящий из первичных ключей таблицы ActivityLog и соответствующей таблицы сведений о действиях.

Допущения:

  1. И при условии, что моя главная задача - оптимизировать время вставки, а не время запроса, какой из вышеперечисленных вариантов лучше?

  2. Предполагая, что я хочу иметь возможностьответить на такие вопросы, как:

a.Какие все действия произошли между этим и сегодняшним временем?Пожалуйста, покажите мне все о каждой деятельности, которая произошла так:

When     Activity  WhoWasDoingIt  WhatShoesWereTheyWearing WhatBike Color  WhichSong
1:28 PM  Jogging   Jake           Nike                     NULL     NULL    NULL
4:00 PM  Singing   John           NULL                     NULL     NULL    Ooo laa laa laa laa laa
4:30 PM  Biking   Jane            NULL                     Atlas     Red    NULL
...

b.Какой велосипед произошел сегодня и в какое время?

Нет некластеризованных индексов для внешних ключей

Обратите также внимание, что для внешних ключей не созданы некластеризованные индексы,Должен ли я их создавать?

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

Определенный продукт базы данных

Я использую Microsoft SQLСервер 2014.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...