【问题标题】:Database design - do I need one of two database fields for this?数据库设计 - 我需要两个数据库字段之一吗?
【发布时间】:2009-11-29 13:48:02
【问题描述】:

我正在为一个数据库组合一个模式。数据库的目标是跟踪我们部门的应用程序。我有一个重复的问题,我正在尝试解决。

例如,我有一个“应用程序”表。我想跟踪是否有任何应用程序使用数据库或错误跟踪系统,所以现在我在 Applications 表中有名为

的字段

表:应用程序
使用数据库(位)
Database_ID (int)
UsesBugTracking(位)
BugTracking_ID (int)

表:数据库:
身份证
名字

表:BugTracking:
身份证
名字

我是否应该将“uses”列与相应的 ID 列合并,以便应用程序表中只有一个错误跟踪列和一个数据库列?

这里有数据库设计的最佳实践吗?


注意:我想运行“使用错误跟踪的应用程序百分比”之类的报告(尽管我猜这两种方法都可以生成此数据。)

【问题讨论】:

    标签: sql-server database-design


    【解决方案1】:

    您可以删除“uses”字段并使 id 列可以为空,并让空值表示它不使用该功能。这是表示缺失值的常用方式。

    编辑:
    要回答你的笔记,你可以很容易地得到这样的统计数据:

    select
      count(*) as TotalApplications,
      count(Database_ID) as UsesDatabase,
      count(BugTracking_ID) as UsesBugTracking
    from
      Applications
    

    【讨论】:

      【解决方案2】:

      为什么不去掉两个 Use 字段,简单地让 _ID 字段中的 NULL 值表示记录不使用该应用程序(错误跟踪或数据库)

      【讨论】:

      • 这就是我的问题。这是你的推荐吗??
      【解决方案3】:

      任何一种解决方案都有效。但是,如果您认为您可能希望偶尔只获取具有/不具有数据库/错误跟踪的应用程序列表,请考虑使用标志字段将查询减少一个(或两个)连接。

      位字段 略微非规范化,因为您必须保持两个字段同步以保持一条数据更新,但我倾向于在这种情况下更喜欢它们,原因是我给出的在上一段中。

      另一种选择是让该字段为空,并为那些没有数据库/等的条目放入空,但随后您会遇到外键约束问题。

      我认为没有任何一种至高无上的正确方法,只需考虑权衡并选择对您的应用有意义的方法。

      【讨论】:

        【解决方案4】:

        我会为对象使用 3 个表:ApplicationDatabaseBugTracking。然后我会使用 2 个连接表进行一对多连接:ApplicationDatabasesApplicationBugTracking

        这 2 个连接表将同时具有 application_id 和另一个表的 id。如果应用程序使用单个数据库,它将有一个 ApplicationDatabases 记录将它们连接在一起。使用此设置,应用程序可能有 0 个数据库(ApplicationDatabases 表中没有此应用程序的记录)或许多数据库(ApplicationDatabases 表中此应用程序的多个记录)。

        【讨论】:

        • OP已经是一对多的关系,你说的是多对多的关系。
        • 我明白你为什么这么说,但模型中可能不需要它。
        【解决方案5】:

        “我应该合并“使用”列吗?

        如果我查看您的问题陈述,那么要么根本没有“使用”列,要么有两个。无论哪种情况,你说“THE”用途栏都是错误的。

        我可以礼貌地建议您在提问时要学会精确吗?

        【讨论】:

        • 首先,你在这里取了一句。我说您是否应该将使用列与 ID 列合并。 . .我已将其更改为更明确,但我可以礼貌地建议您阅读完整的问题以了解上下文
        【解决方案6】:

        是的,在外键字段中使用 null 应该没问题 - 使用位字段似乎是多余的。

        另一种方法(尽管它可能被数据库人员认为是邪恶的^^)是将它们默认为 0,并在 bugtrack 和数据库表中添加 ID 0 数据行,名称为“None”.. . 当你做报告时,你将不得不做更多的工作,除非你以一个整洁的百分比呈现“无”值......

        【讨论】:

          【解决方案7】:

          回答编辑后的问题-

          是的,应该组合字段,NULL 表示应用程序没有数据库(或错误跟踪器)。

          【讨论】:

          • 对于#1 和#2,您误解了问题,数据库和错误跟踪器是完全独立的,并且具有上面列出的独立表。我不是在问是否将它们合并为一列
          猜你喜欢
          • 2019-04-16
          • 1970-01-01
          • 2020-04-09
          • 1970-01-01
          • 1970-01-01
          • 2012-10-24
          • 1970-01-01
          • 2015-10-22
          • 2010-11-09
          相关资源
          最近更新 更多