当其中一个值的类型不同时,在复合键中使用的最佳类型

cas*_*One 1 sql-server-2008 database-design sql-server unique-constraint

我正在为已抓取的多个博客站点的内容构建数据存储。这些站点中的每一个都将在Blog表中包含一个条目

BlogId                  Url                         Version
int, PK, identity       varchar(2500), not null     int, not null
-----------------       -----------------------     -------------
                1       'http://site1.com/                      1
                2       'http://site2.com/                      1
                3       'http://site2.com/                      2
Run Code Online (Sandbox Code Playgroud)

然后会有一张Post表:

BlogId                Url                        PostId
int, FK, not null     varchar(2500) not null     ?
Run Code Online (Sandbox Code Playgroud)

对于我正在查看的大多数博客,我可以轻松辨别出 PostId对它们来说独一无二价值。

对于所有博客,Url将是唯一的BlogId值。但是,Url经常可能发生变化

但是,有一些博客PostId在抓取 HTML 时我无法辨别出很好的价值。在这些情况下,我可以得到datetimeoffset发布帖子的信息。发布频率的准确性在分钟级别。

问题是,我需要使用BlogIdPostId但我不确定我应该输入什么PostId。我一直在想两个选择:

  • sql_variant- 我可以int对我的大多数网站使用 an ,这很好,然后datetimeoffset用于那些我无法轻易辨别唯一数字的网站PostId
  • bigint-PostId将适合这里,我可以将其编码datetimeoffsetbigint(2011-11-11 13:59将成为201111111359)
  • 或者其他一些我没有想过的方法。

其他一些关键事实:

  • Post表最初只有几千条记录(如果超过五千条,我会感到惊讶)
  • 有tags、category等相关的表,会和这个表连接起来(最多可能几千条记录)
  • 这些表中的任何一个的增长都不会是天文数字。 也许每年还有五千条记录(这对我来说是保守的,但你永远不知道)
  • 该键将仅用于创建索引/约束,目前,我不预见在查询中使用它(我正在链接到其他更值得关注的属性)。

Jac*_*las 5

我什至不会考虑将不同类型的数据强制到一个字段中。

另外一个选项:

  • 合成 post_id 和
  • “native_post_id”的每种“类型”的子表

如有必要,有多种方法可以强制执行这些子表和父表之间的子集关系