我想为我正在开发的一个小项目设计数据库表的一些建议。假设在这个系统中我有articles
,subarticles
和comments
。
每篇文章都有子文章。文章和子文章都可以有评论。我认为每个表都有一个autoincrementing int主键(即articleId,subarticleId和commentId)。子文章将有一个articleId作为Article
表等的外键。
但出于某些原因,我想要一个全球唯一ID的概念。实现这个的最佳方法是什么?我应该在每个表中都有一个uuid
主键,并使用前面提到的Id列作为常规列(因为我仍然希望与每个对象关联的逻辑编号)?或者我应该制作某种包含object
?
uuid
映射表
任何有关实施此方法的好方法的建议都将受到赞赏!
答案 0 :(得分:5)
我只有表Article
和Comment
,而Article表将有一个空的ParentArticleID
字段。
Article ------- ArticleID (int PK) ParentArticleID (nullable int FK) ... Comment ------- CommentID (int PK) ArticleID (int FK) ...
如果确实需要GUID,请不要将其用作PK,因为索引编制时效果不佳。为GUID创建单独的字段。
答案 1 :(得分:3)
保持简单。
如果您必须拥有UUID,请不要将其作为主键。由于您还希望拥有唯一的数字标识符,因此复杂且难以跟踪。如果需要,只需要一个单独的UUID字段。
那么,现在你有文章和评论(子文章只是另一篇文章,没有?)。文章有article_id,评论有comment_id。两个标识列。
Pseudo Defs in Transact SQL
table Article (
article_id bigint identity not null
, parent_id bigint null --populate for child or sub articles
, object_id uuid not null
, constraint article_pk primary key (article_id)
)
table Comment (
comment_id bigint identity not null
, article_id bigint not null --assuming comments MUST have an article YMMV
, object_id uuid not null
, constraint comment_pk primary key (comment_id)
, constraint comment_article_fk foreign key (article_id)
references Article (article_id)
)