![]() |
1
10
当我遇到这样的问题时,另一种选择是将订单作为历史表。它的功能是一样的,但是更容易理解
编辑:如果列的数量达到你喜欢的高,你可以分开它不管你喜欢。 如果使用其他选项并使用历史记录表,则应考虑使用 bitemporal 因为您可能需要处理历史数据需要更正的可能性。例如,客户将其当前地址从A更改为B,但您还必须更正当前要完成的现有订单上的地址。
|
![]() |
2
6
在设计数据结构时,要非常小心地存储正确的关系,而不是类似于正确关系的东西。如果需要维护订单的地址,那是因为地址是订单的一部分,而不是客户。而且,单价是订单的一部分,而不是产品等。 尝试这样的安排:
如果你真的需要储存 历史 例如,跟踪订单随时间的变化,那么应该使用日志或审计表,而不是事务表。 |
![]() |
3
4
通常,订单只是按订单时的状态存储信息。尤其是零件号、零件名称和价格以及客户地址和名称。这样,您就不必连接到5或6个表来获取可以存储在一个表中的信息。这不是非规范化,因为您实际上需要拥有订单时存在的信息。我认为,在order和order detail(存储单独订购的项目)表中包含这些信息的可能性较小,因为数据的意外更改也会降低风险。 您的订单表不会有数百列。由于一对多关系,您将拥有一个订单表和一个订单明细表。订单表将包括订单号customer id 9,这样您就可以搜索该客户曾经订购过的所有商品,即使名称发生了变化)、客户名称、客户地址(注意,您不需要市/自治区邮政编码等,请将地址放在一个字段中)、订单日期以及其他一些与订单直接相关的顶级字段。然后您就有了一个订单明细表,该表包含订单号、明细id、零件号、零件描述(可以是一组字段的合并,如大小、颜色等,也可以将最常见的字段分离出来)、项目编号、单位类型、单位价格、税金、总价、发货日期、状态。您为订购的每件商品输入一个条目。 |
![]() |
4
2
警告1:这里没有SQL,几乎所有你认为你知道的关于关系模型的东西都是假的。有充分的理由。 警告2:你应该好好想想,好好想想。 警告3:这本书是关于这一系列问题的解决方案应该是什么样子的,但正如导言所说,它不是关于当今任何可用的技术。
|
![]() |
5
0
我自己喜欢保持简单。我将使用两个表,一个customer表和一个customer history表。如果您在历史表中有键(如customerId),则没有理由创建联接表,对该键进行选择将给出所有记录。
所以我的看起来像这样:
DataOfChagne字段是将customer表(从此记录中的值)更改为CustomerTable中值的较新记录中的值的日期 您的orders表只需要一个CustomerID,如果您需要在下单时查找客户信息,那么这是一个简单的选择。 |
![]() |
6
0
你想要的是所谓的数据仓库。由于数据仓库是OLAP而不是OLTP,因此建议您根据需要拥有尽可能多的列,以实现您的目标。就你而言
这是个好的开始。 |
![]() |
7
0
我们的工资系统使用 生效日期 在许多桌子上。ADDRESSES表的键是EMPLID和EFFDT。这使我们能够跟踪员工地址的每次更改。您可以使用相同的逻辑来跟踪客户的历史地址。您的查询只需要包含一个子句,将订单日期与订单时生效的客户地址日期进行比较。例如
目标是在客户中选择生效日期在订单日期当天或之前的最近一行。同样的策略也可以用来保存产品价格的历史信息。 |
![]() |
developer · 带外键的SQL表设计 5 月前 |
![]() |
relatively_random · 确保两个表之间一致的共同参考 7 月前 |
![]() |
b126 · 在两种不同的Oracle模式上执行相同查询的速度差异很大 1 年前 |
![]() |
robertspierre · 在多对多关系中自动删除未引用的行 1 年前 |
![]() |
Michael Samuel · MYSQL在以下情况下自动创建索引 7 年前 |