首先,我明白这听起来像是一个主要基于意见的问题。但我真的没有要求任何人提供不同的选择,而是以下哪一个最好。
我想知道的是下面的选项中的哪些被认为是最接近最佳实践的,哪些被认为是干净的方法?
请注意:我使用php来处理信息i/o,因此有些选项可能需要额外的处理才能完成事务。
发行
我在一家公司工作,该公司销售不同种类的产品,并有多个页面用于用户交互,我们想跟踪。
解决方案
我提出的解决方案是创建一个关系表来保存所有发生的更新。即,当一个新行插入到一个表中时,另一行插入到updates表中,说明该项是由2015-11-20 13:05:34=>user_id1上创建的。当一行被更改时,一个新行被插入到updates表中,表中有日期和时间,并有一个注释,说明它是最后一次修改的。为了创建这个解决方案,我将这个想法缩小为几个选项。
**选择1
创建一个名为updates的表,每种类型的行都有一个列,其前缀为_id,一个user列说明执行操作的人,一个日期时间列,以及一个保存操作内容的列。结果与此类似:

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

但是,大约有15-20个*_id需要创建,并且每次添加功能时,我们都需要向该表添加另一个*_id列。
**选择2
创建一个名为updates的表,其中有一个referring_id列和一个type列。基本上,type将对应于操作发生的表,referring_id将对应于特定行。结果与此类似:
+----+-------+-------+------------+----------+--------------+
| 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_ids的列添加到包含json或serializedarray字符串的每个表中,该字符串包含与id表中的updates对应的id数组。其结果与此类似:
Updates表格
+----+-------+-------+------------+
| id | time  | user  |   action   |
+----+-------+-------+------------+
|  1 | NOW() |     1 | "Deleted"  |
|  2 | NOW() | 10039 | "Created"  |
|  3 | NOW() | 30845 | "Modified" |
+----+-------+-------+------------+

Images表格
+----+-------+------------------------------------------------+-----------+
| id | user  |                    filename                    |  updates  |
+----+-------+------------------------------------------------+-----------+
|  1 |     1 | "085c30fce08b794130fe83f6967e03c3c7ecab8e.jpg" | "[1]"     |
|  2 | 10039 | "2387c0f43311c7bb2dc0c82c264d8ffaa09df570.png" | "[2]"     |
|  3 | 30845 | "699ee87816bc9b253a864a999ff92e3c6f0696c5.svg" | "[3]"     |
+----+-------+------------------------------------------------+-----------+

我真诚地感谢你对这个问题的任何解释。

最佳答案

方案1是不可取的,不符合正常形式。
在这种情况下,我会立即想到选项2,因为它正是我们所说的关系描述。但是,如果需要经常查询updates表,则查询可能会变慢。如果在遥远的将来某个时候会发生这种情况,那么您将需要创建度量来处理updates表,可能是缓存表或帮助表。不要过早地优化它,但是你应该知道,当你需要优化它时,时机迟早会到来。
选项3很难查询。想象一下,当您想基于一组用户id查询updates时。这就是痛苦的定义。但是,如果你允许选项3,因为你永远不需要做这样的事情,那么这也可能是可行的。

10-07 12:11