【问题标题】:How to store editable copies of original data in a relational database?如何将原始数据的可编辑副本存储在关系数据库中?
【发布时间】:2021-08-07 10:58:44
【问题描述】:

假设我有两个实体:CompanyOrder

公司:

Id
Name
Phone

订单:

Id
CompanyId
Name
TotalAmount

我简化了这些实体,在实际项目中它们要大得多。

在我的应用程序中,我有一个公司视图,我可以在其中执行基本的 CRUD 操作。订单也是如此。

当我创建订单时,我必须从我的数据库中选择公司。问题是我必须允许用户为每个订单修改公司数据,因此只能为特定订单修改

我有两个解决方案:

第一个解决方案: 创建一个单独的表 OrderCompany,我可以在其中存储每个订单的公司数据副本。在这种情况下,我可以编辑副本,它不会影响原始公司,但我有疑问,因为它将是 Contacts 表的完整副本,只有一个附加字段 - OrderId。

第二种解决方案: 将公司的副本直接存储在 Companies 表中,并在此表中添加 OrderId。原始公司将使用 OrderId = null 存储,对于副本 OrderId 将被分配。在这种情况下,我没有像第一个解决方案那样有 2 个几乎相同的表,但我不确定将原件和副本存储在同一个表中是否是个好主意。

您认为这两种解决方案中哪一种更好?也许有更好的方法?

【问题讨论】:

    标签: sql database-design relational-database


    【解决方案1】:

    我怀疑您混淆了一些不同的概念。 “公司”不应该改变。但是,公司可能有一些东西——比如“联系人”——会发生变化。

    所以,我认为您想要一个模型:

    • companies,里面有公司的基本信息,如companyid和公司名称等。此信息不会改变(或至少不会每个订单)。公司也会有一个默认的“联系人”。
    • companyContacts,用于公司联系人。这将有一个companyId,然后是附加信息。不同的联系人可能用于不同的订单。
    • orders 将有一个 companyContactId

    然后订单将分配给一家公司和公司内的特定联系人。可以根据需要创建新的联系信息。

    【讨论】:

    • 在我们的例子中,没有联系人,只有公司。可以针对每个订单调整公司数据。例如,我有一家 Microsoft 公司,我想为这家公司创建 3 个订单,但在一个特定订单中,我想更改公司电话。这在我们的系统中并不常见,但仍然存在。
    • @GlebSkripnikov 。 . .我的建议是您的数据模型不完整。
    【解决方案2】:

    我想我们可以采用您的第一种方法,因为公司表中的任何更改都不会花费 OrderCompany 表中的任何更改。

    【讨论】:

      猜你喜欢
      • 2016-06-12
      • 1970-01-01
      • 2011-08-19
      • 2021-09-23
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 2020-08-06
      • 2010-09-26
      相关资源
      最近更新 更多