Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 订单和订单行表格-重复数据或使用版本控制?_Php_Mysql_Sql_Database_Database Design - Fatal编程技术网

Php 订单和订单行表格-重复数据或使用版本控制?

Php 订单和订单行表格-重复数据或使用版本控制?,php,mysql,sql,database,database-design,Php,Mysql,Sql,Database,Database Design,将名称和价格复制到订单行表(来自产品和选项表的参考)中是否不好 我已经检查了一些流行的电子商务开源PHP脚本,它做到了 假设下表(快速示例): 产品表格: +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+---

将名称和价格复制到订单行表(来自产品和选项表的参考)中是否不好

我已经检查了一些流行的电子商务开源PHP脚本,它做到了

假设下表(快速示例):

产品
表格:

+------------+--------------+------+-----+---------+----------------+
| 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    |                |
+------------+--------------+------+-----+---------+----------------+