【问题标题】:Database design for a small CRM/invoicing system小型CRM/发票系统的数据库设计
【发布时间】:2011-04-20 13:21:21
【问题描述】:

我目前正在为我的客户开发一个小型客户关系和发票管理系统。我遇到了一些我想讨论的小问题。

关于订单、客户和产品的最佳做法是什么。我的客户是否可以删除订单、客户和产品?

目前我围绕订单、客户和产品之间的关系原则设计了我的数据库,如下所示:

客户
身份证
名称
...

产品
身份证
名称
价格
...

订购
身份证
客户编号
订购日期
...

订单行
身份证
订单编号
产品ID

这样我可以连接所有不同的表。但是,如果我的客户删除了一个产品,当他后来打开几个月前创建的包含该项目的订单时会发生什么。它会消失,因为它已被删除。客户也是如此。

我应该在单击删除按钮时禁用产品和客户还是最佳做法?

如果我在客户决定删除产品时说禁用产品,那么如果他稍后尝试添加与禁用产品具有相同产品 ID 的新产品,我是否应该再次启用该项目?

请分享你的智慧:D

【问题讨论】:

    标签: database database-design crm invoice


    【解决方案1】:

    您为什么希望能够删除订单?我认为这样的系统会锁定订单,以便您知道自己有良好的历史记录。客户也一样,为什么要删除他们?也许是一种“归档”它们的方法,必须设置一些标志,这样它们就不会出现在客户列表或其他东西上。

    至于禁用然后输入具有相同产品 ID 的新项目 - 我也不确定您为什么要这样做,每个产品 ID 都是唯一的,即使您停止使用产品,它也应该保留它是产品 ID,因此您有记录。但是如果你必须,那么你可以在业务规则中设置一个约束,大意是“如果没有具有此产品 ID 的活跃产品,则允许它。如果我们有一个活跃的产品并且它具有相同的产品 ID,然后抛出错误。”因此,您只允许一个具有该产品 ID 的活动产品 - 但老实说,我认为这会令人困惑,并且在后端,您将希望使用每个产品不变的唯一 ID 来链接表。

    【讨论】:

      【解决方案2】:

      我会为 IsActive 添加一个布尔列,而不是“删除”。这样您就不会丢失历史数据。例如,如果他们能够删除客户,那么他们将无法查看有关该客户的历史记录,这可能会使查看统计数据变得困难或不可能。对于订单表,您可以有一个代表“当前”、“已取消”、“已填充”之类的列来完成相同的事情。该列应该是查找/代码表的代码。

      【讨论】:

        【解决方案3】:

        “如果我在客户决定删除产品时说禁用产品,那么如果他稍后尝试添加与禁用产品具有相同产品 ID 的新产品,我应该再次启用该项目吗?”

        完全取决于您的业务场景 - 客户目前维护它的方式有何独特之处? (说手动?)当一个早先停产的旧产品突然重新出现时,他们如何处理? (他们将其视为新产品还是开始引用旧产品?)我想这些问题没有正确或错误的答案,这取决于功能 - 始终建议了解现有流程(减去软件) 已经被客户关注,然后将他们映射到软件功能。

        例如。您总是可以添加一个“具有此代码的产品已经存在 - 您要使用它而不是创建一个新产品吗?”一种消息。此外,您在表格中用作外键的产品 ID 和用于向客户展示的产品 ID 最好有所不同——您不想混淆它们。

        【讨论】:

        • 谢谢,使用不同的 id 作为 FK/PK 比我的客户使用他的产品 ID 更有意义,我会实现它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-29
        • 1970-01-01
        • 2011-02-10
        • 2012-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多