【问题标题】:Do i need a special database constraint on this table?我需要对这个表有一个特殊的数据库约束吗?
【发布时间】:2023-03-29 06:57:01
【问题描述】:

我们的数据库中有一个评论系统。就像 stackoverflow -> 每个帖子都有一个 cmets 列表。 kewl。

匿名用户也可以添加评论或注册用户。

在我的表中,我正在考虑以下内容:

  • Userid int NULLABLE
  • AnonymousNickname varchar(100) NULLABLE
  • AnonymousEmail varchar(200) NULLABLE

现在只能是其中之一。你要么注册,要么没有。

那么我应该强制执行某种类型的约束,即 one or other .. 如果是,如何?

注意:数据库是 Microsoft Sql Server 2008。

干杯!

【问题讨论】:

    标签: sql-server-2008 unique-constraint


    【解决方案1】:

    一个简单的约束是

    (Userid is not null and AnonymousNickname is null and AnonymousEmail is null)
    or (Userid is null and AnonymousNickname is not null and AnonymousEmail is not null)
    

    这将强制只设置一个或另一个。根据您的应用程序,这听起来是合理的。由您决定在数据库或应用程序中强制执行它。如果它是应用程序的其他部分所依赖的硬约束,那么我可能会在数据库中强制执行它并通过代码中的验证来检测它。

    【讨论】:

    • 我肯定会在应用程序中检查这个,但我喜欢总是有非常紧凑的代码一个紧凑的 Db,所以我不确定这是否也可以在数据库中完成。如果有,怎么做?
    • tvanfosson 的答案是你如何在数据库中做到这一点 - 在表上创建一个约束并使用他的代码......
    • 哦..对不起。我以为那是一些伪代码。对不起。我以前从未做过约束。 /我隐藏起来。
    【解决方案2】:

    我不会包含约束。您应该将匿名名称字段重命名为 name。当注册用户发表评论时,将他们的用户名输入名称字段。当您列出您的 cmets 时,这可以节省您对用户表的查找。此外,如果从用户表中删除用户,他们的 cmets 会比他们更长寿。

    【讨论】:

    • 您的方法会使数据库非规范化。如果一个用户被删除,他们将拥有大量的子记录,因此不能从字面上删除,但只是标记为非活动状态。
    • @rmeador:我的架构或 joemucchiello 的架构会非规范化吗?另外,我不明白你想说什么,当(如果)用户被删除??
    猜你喜欢
    • 2011-02-05
    • 2011-04-07
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2012-07-21
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多