Какая из следующих четырех конструкций баз данных дала бы мне лучшее время вставки?
Конструкция 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
и соответствующей таблицы сведений о действиях.
Допущения:
И при условии, что моя главная задача - оптимизировать время вставки, а не время запроса, какой из вышеперечисленных вариантов лучше?
Предполагая, что я хочу иметь возможностьответить на такие вопросы, как:
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.