Php 什么';构造多关系notes或更新表的最佳方法是什么?

Php 什么';构造多关系notes或更新表的最佳方法是什么?,php,mysql,database,relational-database,structure,Php,Mysql,Database,Relational Database,Structure,首先,我明白这听起来像是一个主要基于观点的问题。但我并不是要求任何人提供不同的选择,而是以下哪一项是最好的 我想知道的是以下选项中哪一个被认为是最接近最佳实践的,哪一个被认为是干净的方法 请注意:我使用php处理信息I/O,因此某些选项可能需要额外处理才能完成事务 问题 我在一家公司工作,该公司销售不同种类的产品,并且有多个我们想要跟踪的用户交互页面 解决方案 我提出的解决方案是创建一个关系表来保存所有发生的更新。也就是说,当一个新行插入到表格中时,另一行被插入到更新的表格中,说明项目是由20

首先,我明白这听起来像是一个主要基于观点的问题。但我并不是要求任何人提供不同的选择,而是以下哪一项是最好的

我想知道的是以下选项中哪一个被认为是最接近最佳实践的,哪一个被认为是干净的方法


请注意:我使用php处理信息I/O,因此某些选项可能需要额外处理才能完成事务

问题 我在一家公司工作,该公司销售不同种类的产品,并且有多个我们想要跟踪的用户交互页面

解决方案 我提出的解决方案是创建一个关系表来保存所有发生的更新。也就是说,当一个新行插入到表格中时,另一行被插入到
更新的
表格中,说明项目是由
2015-11-20 13:05:34
用户id
=>
1
创建的。当一行被更改时,一个新行被插入到
updates
表中,并带有日期和时间以及一条说明,表明它是上次修改的。为了创建这个解决方案,我将想法缩小为几个选项


**选择1 创建一个名为
updates
的表,其中每种类型的行都有一列前缀为
\u id
,一列为
用户
列以说明执行操作的人,一列为日期时间列,一列为保存操作内容的列。结果与此类似:

+----+-------+-------+------------+-----------+----------+-----------+--------+
| id | time  | user  |   action   | design_id | image_id | upload_id | ..._id |
+----+-------+-------+------------+-----------+----------+-----------+--------+
|  1 | NOW() |     1 | "Deleted"  |           |       15 |           |        |
|  2 | NOW() | 10039 | "Created"  |           |          |     50678 |        |
|  3 | NOW() | 30845 | "Modified" |        11 |          |           |        |
+----+-------+-------+------------+-----------+----------+-----------+--------+
+----+-------+-------+------------+----------+--------------+
| id | time  | user  |   action   |   type   | referring_id |
+----+-------+-------+------------+----------+--------------+
|  1 | NOW() |     1 | "Deleted"  | "image"  |           15 |
|  2 | NOW() | 10039 | "Created"  | "upload" |        50678 |
|  3 | NOW() | 30845 | "Modified" | "design" |           11 |
+----+-------+-------+------------+----------+--------------+
但是,大约需要创建15-20个
*\u id
s,每次我们添加一个功能时,我们都需要在此表中添加另一个
*\u id


**选择2 创建一个名为
updates
的表,其中包含一个
referenting\u id
列以及一个
type
列。基本上,
类型
将对应于操作发生的表,
引用id
将对应于特定行。结果与此类似:

+----+-------+-------+------------+-----------+----------+-----------+--------+
| id | time  | user  |   action   | design_id | image_id | upload_id | ..._id |
+----+-------+-------+------------+-----------+----------+-----------+--------+
|  1 | NOW() |     1 | "Deleted"  |           |       15 |           |        |
|  2 | NOW() | 10039 | "Created"  |           |          |     50678 |        |
|  3 | NOW() | 30845 | "Modified" |        11 |          |           |        |
+----+-------+-------+------------+-----------+----------+-----------+--------+
+----+-------+-------+------------+----------+--------------+
| id | time  | user  |   action   |   type   | referring_id |
+----+-------+-------+------------+----------+--------------+
|  1 | NOW() |     1 | "Deleted"  | "image"  |           15 |
|  2 | NOW() | 10039 | "Created"  | "upload" |        50678 |
|  3 | NOW() | 30845 | "Modified" | "design" |           11 |
+----+-------+-------+------------+----------+--------------+
我认为这可能是最好的选择,因为在它就位后,不需要添加额外的列,而且看起来更容易阅读


**选择3 创建一个名为
updates
的表,其中不包含任何关系id,只包含用户
X
在特定时间创建/修改/删除的内容。将名为
update\u ids
的列添加到每个表中,这些表将包含一个JSON或序列化的Darray字符串,其中包含与
updates
表中的
id
对应的id数组。结果与此类似:

+----+-------+-------+------------+-----------+----------+-----------+--------+
| id | time  | user  |   action   | design_id | image_id | upload_id | ..._id |
+----+-------+-------+------------+-----------+----------+-----------+--------+
|  1 | NOW() |     1 | "Deleted"  |           |       15 |           |        |
|  2 | NOW() | 10039 | "Created"  |           |          |     50678 |        |
|  3 | NOW() | 30845 | "Modified" |        11 |          |           |        |
+----+-------+-------+------------+-----------+----------+-----------+--------+
+----+-------+-------+------------+----------+--------------+
| id | time  | user  |   action   |   type   | referring_id |
+----+-------+-------+------------+----------+--------------+
|  1 | NOW() |     1 | "Deleted"  | "image"  |           15 |
|  2 | NOW() | 10039 | "Created"  | "upload" |        50678 |
|  3 | NOW() | 30845 | "Modified" | "design" |           11 |
+----+-------+-------+------------+----------+--------------+
更新
表格
图像
表格 我真诚地感谢您对这个问题的任何解释。


选项1是不可取的,不符合正常形式

选项2是我在这种情况下会立即想到的选项,因为它正是我们正在谈论的关系描述。但是,如果需要经常查询
更新
表,那么查询可能会变慢。如果这将在遥远的将来发生,那么您将需要创建措施来使用
更新
表,可能是缓存或帮助表。不要过早地对其进行优化,但您应该知道,需要对其进行优化的时间迟早会到来


选项3很难查询。想象一下,当您想要基于一小组用户ID查询
更新时。这就是疼痛的定义。但是,如果您可以允许选项3,因为您永远不需要这样做,那么这也可能是可行的。

奇怪的是,您会使用“关系型”在引用时描述选项2。\u id不表示单个域,这意味着该表实际上不表示关系。只有当管理员需要查看某个项目的历史记录或某个web开发人员需要概述某个项目的特定历史记录时,才会查询该表。因此,我不认为它会被过度查询,因为每个数据库事务至少包含两个要完成的查询。谢谢大家!@reaanb那么你会用什么其他术语来描述这种模式呢?就定义而言,关系数据库是
一种结构化的数据库,用于识别存储的信息项之间的关系。
。在这种情况下,它将通过使用
类型
参考_id
@iam解码器来识别模式,以便在数据库上下文中更严格地定义关系,请参见Codd或Date的著作。选项2让人想起网络模型。它的关系版本更接近选项3,除了使用UpdateImage表将图像与更新关联,而不是将其打包到images表中字段中的数组表示法。规范化选项1将给出相同的结果。@reaanb感谢阅读材料和解释。我将采用网络样式表来处理此操作!:)