我有一些存档的日志文件要导入到MySQL数据库中,用于存档和查询功能。
这些日志文件中的每一行代表一种特定类型的事件。为了说明这一点,下面是一个示例,其中每一行都是不同的事件类型:

2013-01-15 03:30:08 - Failed login attempt for user 'helloworld' by 1.2.3.4
2013-01-15 03:30:08 - User 'helloworld' successfully logged in from 1.2.3.4
2013-01-15 03:30:08 - User 'helloworld' issued command 'randomcommand'

请注意时间戳,因为它与问题相关。
我最初的想法是为每个事件创建一个表-failed_loginssuccessful_loginscommands,等等。
这种方法的问题是,当多个事件在同一秒发生时(时间戳只有二级精度),因为它们在不同的表中,我无法知道它们发生的实际顺序。
我的下一个想法是使用一个表,主键保持顺序,但这会很快失去对所有事件类型的控制。(不止这些。)
CREATE TABLE log_lines (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    type INT, // 1 = failed_login, 2 = command, ...
    failed_logins_user VARCHAR(32),
    failed_logins_ip VARCHAR(15),
    commands_user VARCHAR(32),
    commands_command VARCHAR(128)
);

我觉得有更好的方法来完成这件事。
总而言之,我的目标是在保持日志文件中每个事件发生顺序的同时,使数据可查询。我该怎么办?

最佳答案

一种可能的解决方案:每行使用两个表:一个表存储所有事件共有的列,如序列号(一个AUTO_INCREMENT列)和时间戳,一个表指定事件以提供其他详细信息。您可以首先插入到公共表中,然后使用在其中生成的ID作为其他表中的唯一外键。
但也要记住,NULL值通常只占用一位数据,因此一个包含许多列的表(仅对某些事件类型需要)可能是更好的解决方案。这取决于您的查询:如果您通常按顺序查询所有类型的事件,那么一个表会更好,而提取给定类型的特定事件可能更适合使用不同的表。

type INT, // 1 = failed_login, 2 = command, ...

对于此类列,最好使用enum

关于mysql - 保留多个表的插入顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15064076/

10-17 01:48