【问题标题】:Notes system in database数据库中的注释系统
【发布时间】:2014-09-23 10:22:54
【问题描述】:

我目前正致力于在 Access 2013 中构建 ERP/CRM 数据库,以涵盖经营业务的所有非财务方面,例如客户/供应商信息、联系人、订单和交货跟踪等。

我们生产定制的细木工产品(窗户、门等)。我发现的一件事是,我需要能够为数据库中几乎每个表中的记录编写注释。例如,我可能想在以下表格上写笔记:

  • tblAccount 保存客户和供应商信息,例如“这个客户总是有特殊的玻璃”。
  • tblDelivery - “客户要求司机将车停在伦敦路的房子后面”。
  • tblQuote - “报价不包括钢材的木材覆层 - 由其他人提供”。

等等。等等

所以目前我有一个tblNote,其中包含以下字段:

  • NoteID - PK
  • AccountID - FK 到 tblAccount
  • DeliveryID - FK 到 tblDelivery
  • QuoteID - FK 到 tblQuote
  • 其他表的更多 FK 包含我可能需要记录的内容。
  • EnteredByUsedID - 将注释输入系统的数据库用户的 FK 到 tblUser
  • EntryDate - 输入日期注释
  • NoteText - 备注文本
  • CommTaskID - 稍后解释 - 见下文

当输入一个新的音符时,其他表格的大部分 FK 将是空白的(除了那些音符实际涉及的)。注释将在子表单上查看,例如浏览客户帐户时,会出现一个显示该客户备注的框。

在自己的表中添加注释的原因是数据库中的每条记录(例如客户帐户)可能需要附加多个注释。

我还想实现任务分配和跟踪以及通信记录。例如,当我们接到潜在新客户的电话询问报价时,我们会记录该电话已接听,以及何时,客户的联系方式,请注意他们已要求报价以及有关他们想要报价的次要详细信息,加上特定数据库用户或未指定任何人所需的操作标记它。它也可以创建为

考虑到这一点,我有tblCommTaskLog,它具有以下字段:

  • CommTaskID - PK
  • CommMethodID - FK 到 tblCommMethod,其中包含 Phone callFaxEmailIn Person 等内容。
  • AccountID - 联系人(客户/供应商)的账户记录
  • EnteredByUserID输入此记录的用户的 FK。
  • EntryDate
  • IsActionRequired - 布尔值
  • ActionRequiredByUser - FK 到用户表以标记需要对此项目采取操作的人员(如果此操作可由任何人完成,则可以为空白)。
  • ActionCompletedDate - 操作标记为完成的日期。
  • ActionCompletedByUser - 完成任务的用户的用户表的另一个 FK。

如上所示,notes 表中有一个CommTaskID,它允许您创建包含有关通信或任务的任何相关注释的注释记录。

基本上我的问题是:有没有更好的方法来解决这个问题?我错过了什么吗?这似乎是一种笨拙的处理方式,但我无法想出一个更好的遵循 DB 规范化规则的方式。

【问题讨论】:

  • 为什么不将外键存储在notes表中,为什么不反过来将notes中的主键NoteID存储为所有可以有notes的表中的可为空的外键,例如tblAccount?
  • 我在问题中解决了这个问题:“在他们自己的表中有注释的原因是数据库中的每条记录(例如客户帐户)可能需要附加多个注释” .我需要一对多,以便在必要时为每条记录添加许多注释。
  • 哦,我错过了。那么我认为你是在正确的轨道上。

标签: database ms-access database-schema


【解决方案1】:

你的想法对我来说很正确。我必须将便笺集成到现有数据库中,而您肯定只需要一个便笺表,其中的字段指定便笺属于哪个表,以及该便笺与该表中的哪个主键相关联。

所以,我想也许你想要这个:

  • NoteID - PK
  • TableID - FK 到一个新表,该表存储您的表的名称
  • TablePK - FK 到 TableID 中引用的表中的主键
  • 对包含我可能需要的东西的其他表的更多 FK 做笔记。
  • EnteredByUsedID - FK 到进入数据库用户的 tblUser 记到系统上。
  • EntryDate - 输入注释的日期
  • NoteText - 笔记的文本
  • CommTaskID - 稍后解释 - 见下文

这样,您就可以知道它属于哪个表,以及它属于该表中的哪条记录。

在查询中,您可以简单地将 TablePK 连接到表中的键,并根据您要加入的表过滤 TableID。

或者,如果您需要建立关系,您可以简单地向您的所有表添加一个新字段,并在其中包含它们的 TableID。

【讨论】:

  • 我已经有点采用了这种方法。你的回答让我意识到每个笔记可能需要引用许多不同的项目,所以虽然我的笔记可能主要是关于 TblQuote 中的 Quote,但我可能还需要参考 @ 中的一些联系方式987654323@,所以我得到的是一个PrimaryTableID,它链接到一个表,该表存储了我正在记录的不同表的名称,如果这有意义的话。这样我就可以确定该笔记需要在我的系统界面中显示的位置。
  • 并非像这样的复杂问题中的每个答案都适合确切的要求,所以我很高兴至少将您推向正确的方向,同时允许您编辑方法以适合您的项目。 “授人以鱼,终其一生;授人以鱼,终生。” :o)
  • 是的,我也是这么认为的。我本可以尝试更详细地解释这些要求,但你会发现,解释得越多,它的意义就越小。感谢您的帮助。
【解决方案2】:

只是一个想法,但是为您要在其上做笔记的每个表设置一个笔记表是否更有意义?

Tbl客户 TblCustomerNotes

TblProduct TblProductNotes

等等

【讨论】:

  • 我不这么认为,因为除了 FK 之外,这些注释表中的每一个都将具有相同的字段,并且每个表都需要以自己的特定形式/代码进行处理。听起来对我来说建造/维护很头疼。
猜你喜欢
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多