我正在为自己编写一个非常简单的博客引擎(因为我遇到的每个博客引擎都太复杂了)。 我想要能够通过其URL唯一地标识每篇文章,URL的格式类似于/2009/03/05/my-blog-post-slug
。为了在数据层面实现这一点,我想创建一个由(Date, Slug)
组成的复合唯一约束条件,其中Date
仅是组合日期的日期部分(忽略时间)。 我有一些自己的想法(例如另一个列,可能是计算得出的,仅包含日期部分),但我来到SO想知道解决这个问题的最佳实践。
我怀疑SQL Server的版本在这里并不重要,但出于记录,我使用的是2008 Express(我希望有一个更具可移植性的解决方案)。
表结构:
create table Entries (
Identifier int not null identity,
CompositionDate datetime not null default getdate(),
Slug varchar(128) not null default '',
Title nvarchar(max) not null default '',
ShortBody nvarchar(max) not null default '',
Body nvarchar(max) not null default '',
FeedbackState tinyint not null default 0,
constraint pk_Entries primary key(Identifier),
constraint uk_Entries unique (Date, Slug) -- the subject of the question
)
选定的解决方案:
我认为marc的解决方案更适合,考虑到这个问题是关于2008年的。但是,我会采用整数方法(但不是使用INSERT
,因为它不能确保数据完整性;我将使用预计算的整数列),因为我认为从客户端(在查询中)使用整数更容易处理。
谢谢大家。
create table Entries (
Identifier int not null identity,
CompositionDate smalldatetime not null default getdate(),
CompositionDateStamp as cast(year(CompositionDate) * 10000 + month(CompositionDate) * 100 + day(CompositionDate) as int) persisted,
Slug varchar(128) not null default '',
Title nvarchar(max) not null default '',
ShortBody nvarchar(max) not null default '',
Body nvarchar(max) not null default '',
FeedbackState tinyint not null default 0,
constraint pk_Entries primary key(Identifier),
constraint uk_Entries unique (CompositionDateStamp, Slug)
)
go