Php 订单和订单行表格-重复数据或使用版本控制?
将名称和价格复制到订单行表(来自产品和选项表的参考)中是否不好 我已经检查了一些流行的电子商务开源PHP脚本,它做到了 假设下表(快速示例):Php 订单和订单行表格-重复数据或使用版本控制?,php,mysql,sql,database,database-design,Php,Mysql,Sql,Database,Database Design,将名称和价格复制到订单行表(来自产品和选项表的参考)中是否不好 我已经检查了一些流行的电子商务开源PHP脚本,它做到了 假设下表(快速示例): 产品表格: +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+---
产品
表格:
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| product_id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(150) | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
选项
表:(一个产品可以有一个或多个选项,例如:小、大、x大等)
该公司将获得约5000个新订单,每天,我正在寻找一个合理的方式如何设计订单,订单线表?是否将名称和价格复制到订单行表中?从选项
表中,每隔几个月就会更改数百个价格
我读过版本控制(类型2),我不确定它实际上是如何工作的,据我所知,我可以在产品
、选项
和订单行表中添加版本id
字段。无论最大版本是什么,它都意味着最新版本。它似乎比使用StartDate和EndDate设计简单得多
我正在寻找的设计方法,可以做到快速和合理的。不太复杂的设计 您的
选项
表不大(行大小,而不是行数),因此多次存储名称应该不会有问题。但是,如果要确保所有“大”选项都使用相同的字符串,则将字符串提取到查找表将有所帮助
作为旁注,您可能需要重新考虑此表的主键,因为使用自动递增字段允许产品多次应用相同的选项
为名称创建查找表需要进行版本控制,因为表的更改会影响历史行。您可以使用版本号或日期范围,以对您更容易的为准,尽管使用日期也会让您知道选项发生更改的时间
日期可能更容易使用,因为您可以使用触发器更新表,将当前时间戳写入表中,而无需知道以前的版本号。使用版本号需要在更新之前进行循环
您可能会发现查看Richard Snodgrass的“开发面向时间的数据库”很有用,可从此处免费获得:
编辑:具有版本信息的表通常有一个日期/时间字段,其中包含该行的“有效自”日期。新行将自动用“CURRENT_TIMESTAMP”填充该行,以便您知道哪一行是最近的。其他方法使用两个字段记录行有效时的开始和结束时间。使用这两个字段可以简化查询,就像您可以执行“选择…”。。。其中,开始日期和结束日期之间的时间点“选项
表格将非常大(超过100000行且具有随机名称(只有几百行是重复的).我不太关心使用日期进行版本控制-它是100%准确的查找吗?我还有一个名为extras
的表,它与选项
链接。例如:一个选项可以有两个额外选项。比方说,我更改了产品的名称
(修复拼写)-链接到的选项表和附加表将发生什么情况?@user791022-我不确定MySQL日期类型的时间部分的分辨率,我知道SQL Server将数据类型改进为mroe精确,但这取决于您期望选项发生更改的速度。在执行查找时,您只想知道c当前版本所以是…其中开始版本日期和结束版本日期之间的当前时间戳应该足够了。酷,我理解我认为。每当更新记录时(例如:product.name更改)-现有记录会发生什么情况?product.id
与选项相关。product\u id
然后是与额外相关的选项表。option\u id
@user791022-我在回答中添加了一些更多信息,但我建议您阅读Snodrass书籍。它非常好而且免费!请参阅我的新问题:)
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| option_id | int(11) | NO | PRI | NULL | auto_increment |
| product_id | int(11) | NO | | NULL | |
| name | varchar(150) | NO | | NULL | |
| price | decimal(6,2) | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+