Текущий Articles
таблица не находится в Normalized form
.
Я скажу, что размещение visits
столбца в Articles
Таблица не является правильным способом De-Normalization
.
ТекущийТаблица Articles
не только создает проблему взаимоблокировки, но и вы не можете получить так много других типов отчетов. Daily Visit Report, Weekly Visit Report
.
Создание Article_visits
таблицы - очень хороший ход. Это будет очень часто обновляться.
Мой Article_visits
дизайн
article_visit_id | article_id | visit_date | visit_count
-----------------+--------------+----------------------+----------------------
1 | 1 | 2019-01-01 | 6
2 | 2 | 2019-01-01 | 3
Здесь Article_Visit_id
равен int identity(1,1)
, что также Clustered Index
.
Create NonClustered Index NCI_Articleid_date ON Article_visits(article_id,visit_date)
GO
Короче говоря, создание CI для article_id,visit_date
будет дорогостоящим делом.
Если для этой article
записи на эту дату не существует записи, вставьте visit_count
1, если она существует, затем обновите visit_count
, т. Е. Увеличьтена 1.
- Нормализовано.
- Вы можете создать любой вид отчета, текущее требование + любое будущее требование.
- Вы можете показать статью мудрым подсчетом. ЗапросЭто так просто и быстро.
- Вы можете получать еженедельно, даже получать годовой отчет так просто и без
Indexed View
.
Фактический дизайн таблицы,
Create Table Article(Articleid int identity(1,1) primary key
,title varchar(100) not null,Descriptions varchar(max) not null
,CreationDate Datetime2(0))
GO
Create Table Article_Visit(Article_VisitID int identity(1,1) primary key,Articleid int not null ,Visit_Date datetime2(0) not null,Visit_Count int not null)
GO
--Create Trusted FK
ALTER TABLE Article_Visit
WITH NOCHECK
ADD CONSTRAINT FK_Articleid FOREIGN KEY(Articleid)
REFERENCES Article(Articleid) NOT FOR REPLICATION;
GO
--Create NonClustered Index NCI_Articleid_Date on
-- Article_Visit(Articleid,Visit_Date)
--Go
Create NonClustered Index NCI_Articleid_Date1 on
Article_Visit(Visit_Date)include(Articleid)
Go
Создайте Trusted FK, чтобы получить преимущество поиска индекса (вкратце). Я думаю, NCI_Articleid_Date
больше не требуется, поскольку Articleid
является Trusted FK
.
Deadlock Issue
: Trusted FK
также было создано для преодоления проблемы тупика. Это часто происходит из-за плохого Application code
или UN-Optimized Sql query
или Bad Table Design
. Помимо этого также есть несколько других веских причин, таких как обработка Race Condition
. Это довольно сложная вещь для DBA. Если тупик слишком сильно болит, то после устранения вышеупомянутой причиныВам может потребоваться Isolation Level
.
Многие проблемы тупиковой ситуации автоматически обрабатываются самим сервером Sql.
На сайте DEASLOCK REASON . * 1067 опубликовано так много статей. *
Я не думаю, что размер таблицы - это проблема
Table size
- это большая проблема. Шансы Deadlock
в обоих дизайнах очень очень малы. Но вы всегда будетеперед лицом demerit
из Big Size
таблицы.
Я говорю вам прочитать еще несколько статей.
Я надеюсь, что это ваша точно такая же реальная таблица с тем же типом данных?
Как часто обе таблицы будут вставляться / обновляться?
Какая таблица будет запрашиваться чаще?
Одновременное использование каждой таблицы.
Дедлок может быть только минимальнымчтобы не было проблем с производительностью или транзакциями.
Какое отношение между Visitorid
и Artcileid
?