【问题标题】:Help with database design帮助数据库设计
【发布时间】:2010-02-03 04:36:45
【问题描述】:

我想要一些建议,为我正在进行的一个小项目设计我的数据库表。假设在这个系统中我有 articlessubarticlescomments

每篇文章都可以有子文章。文章和子文章都可以有 cmets。我考虑为每个表(即 articleId、subarticleId 和 commentId)设置一个自动递增的 int 主键。子条目将有一个 articleId 作为 Article 表等的外键。

但出于某些原因,我想有一个全球唯一 ID 的概念。实现这一点的最佳方法是什么?我是否应该在每个表中都有一个 uuid 主键并将前面提到的 Id 列用作常规列(因为我仍然想要与每个对象关联的逻辑数字)?还是我应该制作某种包含uuid 的主要object 映射表?

任何关于实现此功能的好方法的建议都将不胜感激!

【问题讨论】:

  • “但出于某些原因,我想要一个全球唯一 ID 的概念”而这些原因是?
  • 对于我正在做的一些前端工作,我希望能够将每个对象(文章、子文章或评论)一般地视为一个“对象”。为此,我希望每个对象都有一个 uuid。
  • 你能提供一些细节吗?听起来您可能为自己做的工作超出了必要的范围......
  • 只是为了让问题更简单:假设我有多个具有 PK/FK 关系的表。在客户端,这些将被类似地呈现,并将通过其唯一 ID 进行 ID(对于 javascript 内容)。如果 Id 不是全局唯一的,我会遇到问题..
  • 什么问题?选择时就知道数据来自哪个表,为什么不直接将其传递到表示层,以便在显示或渲染代码时使用它来更新相关表?

标签: mysql database database-design


【解决方案1】:

我只需要 ArticleComment 表,而 Article 表将有一个可以为 NULL 的 ParentArticleID 字段。

Article
-------
ArticleID (int PK)
ParentArticleID (nullable int FK)
...

Comment
-------
CommentID (int PK)
ArticleID (int FK)
...

如果您确实需要 GUID,请不要将其用作 PK,因为它在编制索引时表现不佳。为 GUID 创建单独的字段。

【讨论】:

  • +1 最上面的文章的 ID 足够独特 - 所有子文章和 cmets 都绑定到它 - 而且你们中没有从外部调用 cmets - 一个表中的 ID 始终是唯一的。
  • @OrbMan - 不完全是,他的部分问题是“但出于某些原因,我想拥有一个全球唯一 ID 的概念。实现这一点的最佳方法是什么?”
  • @Chris - 他没有为 所有 实体指定唯一 ID(直到稍后发表评论)。我假设他的意思是在文章和子文章之间,而这个架构实现了这一点。
  • @OrbMan - 他做到了,他指定了全局和 UUID,这是普遍唯一的 id。
  • @Chris - UUID 不是一个要求,而是一个实施建议。我将他的需求解释为能够在不重叠 PK 的情况下唯一标识文章和子文章,尽管出现了 globaluuid。通常情况下,您需要在字里行间进行解读,并尝试确定业务的真正需求是什么。在这种情况下,我仍然不相信需要 UUID。
【解决方案2】:

保持简单。

如果您绝对必须拥有 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)      
)

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多