mysql - SQL日志数据库设计

标签 mysql sql database

我需要一个数据库来记录不同的事件。

我有一个主表

CREATE TABLE IF NOT EXISTS `log` (
  `log_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `log_label` varchar(255) NOT NULL,
  `log_level` int(1) NOT NULL DEFAULT '0',
  `log_type` varchar(255) NOT NULL,
  `log_time` datetime NOT NULL,
  PRIMARY KEY (`log_id`)
)

所以我选择并制作了一个边表来包含主日志的任何值。该值可以是动态的。

CREATE TABLE IF NOT EXISTS `log_data` (
  `log_data_id` int(11) NOT NULL AUTO_INCREMENT,
  `log_id` int(11) NOT NULL,
  `log_data_key` varchar(255) NOT NULL,
  `log_data_value` varchar(255) NOT NULL,
  PRIMARY KEY (`log_data_id`)
)

当我需要通过 php 和 mysql 接收数据时,我会遇到一些问题/限制吗?

一个示例是使用“log_type = error”获取所有日志 我应该如何连接 log_data 表中的所有数据?

最佳答案

您缺少较长的日志消息文本列; varchar(255) 很小。

这个设计是一个奇怪的混合体:

  • 如果您想要“通用”设计,log 的大部分字段应降级为 log_data
  • 如果您想记录根本不同类型的事件,则应该为每种类型使用专门且独立的表格,而不要使用笨重的“边表”:

    CREATE TABLE IF NOT EXISTS `chat_membership_log` 
    (
    log_id int(11) NOT NULL AUTO_INCREMENT,
    log_time datetime NOT NULL,
    event_type char(1),--'J'=join, 'L'=leave
    username varchar(40), 
    PRIMARY KEY (`log_id`)
    )
    
    CREATE TABLE IF NOT EXISTS `application_crash_log` 
    (
    log_id int(11) NOT NULL AUTO_INCREMENT,
    log_time datetime NOT NULL,
    PID varchar(20), 
    command_line varchar(2000),
    PRIMARY KEY (`log_id`)
    )
    

关于mysql - SQL日志数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29027486/

相关文章:

django - 跳过 Django 测试数据库创建以获取只读、外部管理、高安全性、大型数据库

sql - 多于一列的 MySql

Mysql存储过程查询限制

java - 在 Java 中评估 SQL 表达式?

Mysql将给定日期范围内的每日总计汇总为每周总计

sql - 如何在SQL Server中选择每个id组的前2个

将逗号分隔列拆分为多对多关系的 SQL 查询

sql-server - 从 ntext 转移到 nvarchar(max) 有什么问题吗

php - 按相同字段分组并显示为 1 个部门

mysql - 如何避免sql命令中的重复数据