私は自分用に非常に単純なブログ エンジンを作成しています (私が遭遇したすべてのブログ エンジンは複雑すぎるため)。のような 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
)
選択したソリューション:
この質問が 2008 年頃であることを考えると、marc の解決策の方が適切だと思います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