我正在构建一个需要广泛记录用户,付款等行为的应用程序。
我最好使用单片日志表,只记录一切......或者为每种类型的操作设置单独的日志表更好吗?log_payment,log_logins,log_acc_changes?
例如,目前我正在记录用户与支付网关的交互。当他们报名参加试用,试用成为订阅时,何时获得重新报销,退款,是否有失败等等。
我还想开始记录不与支付网关交互的操作或事件(更新取消,禁止,在数据被发送到网关进行验证之前截获的支付失败,登录等)。 / p>
修改 将定期检查数据以验证其完整性,因为在此基础上,人们需要获得报酬,因此准确的数据非常关键。读取查询将由我自己和其他2位管理员完成,因此99%的时间都会进行写入/更新。
我只想计算多个表,只是在处理插入和更新支付数据的关键mysql事务中创建了更多的失败点等。
答案 0 :(得分:2)
在所有其他条件相同的情况下,较小的不相交表可以具有性能优势,尤其是当它们写得很重时(因为与日志相关的表可能很容易) - 大多数数据库机制可以更好地针对大多数读取,很少写的表。在编写(以及更新你可能需要维护的任何索引)方面,小的不相交表是一个明显的胜利,特别是如果有任何并发(当然,取决于你用于表的引擎 - 这是非常重要的)考虑在mysql! - )。
在阅读方面,这完全取决于您的查询模式 - 您需要什么样的查询,以及查询的频率。在某些情况下,对于您提到的使用模式,在复制某些信息时可能会有一些性能优势 - 例如如果您经常需要用户的信用或借记的即时运行总数,以及运行总计的详细可审计日志,则保留用户运行总计(逻辑冗余)表可能是保证(以及关于各种信用和借记来源的完美分隔的“日志表”)。
答案 1 :(得分:2)
交易表不应该更改,不可编辑,并且可以作为该类信息的日志文件。设计“计费”表以获得时间戳,这就足够了。
但是,在数据记录可编辑的情况下,您需要跟踪谁更改了什么时间。要做到这一点,你有几个选择。
-
对于给定的表,您可以拥有 table_history 表,该表具有几乎相同的结构,具有NULLable字段和两部分主键(主要原始表的键+序列)。如果对于每个插入或更新操作,您都要在此表中写入记录,则可以完整记录发生在表中的所有内容。
此方法的优点是您可以为所有记录的数据保留相同的列类型,而且查询效率更高。
-
或者,您可以拥有一个包含“table”,“key”,“date”,“who”等字段的日志表,以及存储已更改字段和值的相关表。
此方法的优点是您可以编写一个日志记录例程并在任何地方使用它。
-
我建议您评估表的数量,性能需求,更改音量,然后选择一个并继续使用它。
答案 2 :(得分:1)
这取决于记录的目的。对于调试和一般监视目的,具有动态日志级别的单个日志表将非常有用,因此您可以按时间顺序查看系统正在经历的内容。
另一方面,对于审计跟踪目的,没有什么比具有每个CRUD操作的所有表的重复表更好。这样,支付表中捕获的每个信息或任何将在审计表中捕获的信息。
所以,答案都是。