首先,我明白这听起来像是一个主要基于意见的问题。但我真的没有要求任何人提供不同的选择,而是以下哪一个最好。
我想知道的是下面的选项中的哪些被认为是最接近最佳实践的,哪些被认为是干净的方法?
请注意:我使用php来处理信息i/o,因此有些选项可能需要额外的处理才能完成事务。
发行
我在一家公司工作,该公司销售不同种类的产品,并有多个页面用于用户交互,我们想跟踪。
解决方案
我提出的解决方案是创建一个关系表来保存所有发生的更新。即,当一个新行插入到一个表中时,另一行插入到updates
表中,说明该项是由2015-11-20 13:05:34
=>user_id
在1
上创建的。当一行被更改时,一个新行被插入到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,因为你永远不需要做这样的事情,那么这也可能是可行的。