PHP/MYSQL-如何为25000个用户构建日志数据库

PHP/MYSQL-如何为25000个用户构建日志数据库,php,mysql,database-design,Php,Mysql,Database Design,我在一家公司的5个部门与大约25000名用户(员工)打交道 对于所有这些用户,目前正在使用MS Excel电子表格。电子表格由大约35列组成,记录员工的日常活动 每行有1个活动,平均每天大约有3个活动(永无止境,意味着日志不断增长) 我的问题: 我想构建一个数据库(PHP/MYSQL),它保存这些用户的活动日志,而不是MS Excel文件 我是否应该为每个用户提供一个包含35列的表。。。导致一个包含25000个表的数据库 或者我应该将活动存储到一个35大小的数组中,将其转换为二进制并存储在bl

我在一家公司的5个部门与大约25000名用户(员工)打交道

对于所有这些用户,目前正在使用MS Excel电子表格。电子表格由大约35列组成,记录员工的日常活动

每行有1个活动,平均每天大约有3个活动(永无止境,意味着日志不断增长)

我的问题: 我想构建一个数据库(PHP/MYSQL),它保存这些用户的活动日志,而不是MS Excel文件

  • 我是否应该为每个用户提供一个包含35列的表。。。导致一个包含25000个表的数据库

  • 或者我应该将活动存储到一个35大小的数组中,将其转换为二进制并存储在blob中,然后每年构建这样一个表。。。导致每年1个表,25000行

  • 这样你可以看到一天的活动 您可以查看员工的活动
    可以查看员工在特定日期的活动

    如果您实际使用每个活动的许多/大部分字段,我将使用35列表格

    CREATE TABLE users (
        uid    INT,
        name   VARCHAR(255),
        ...
    );
    
    CREATE TABLE activities (
        uid    INT, // references users.uid
        type   VARCHAR(32),
        date   DATE,
        ... // The 35 activity-related columns
    );
    

    然后我会准时离开。如果搜索性能很重要,并且每年的表太大而无法获得良好的性能,则可能是每年(这意味着每个表最多可以有2740万行),或者每月(每个表大约有220万行)。

    根据经验,您不希望为每个用户创建一个表。您希望有一个表,
    users
    ,用于存储仅与用户模型相关的ID、名称等。然后有一个单独的表格,用
    user\u id
    列记录用户的日常活动,作为
    users
    表格中用户行的参考。

    我很难表达我有多高兴你来这里问这个问题,而不是拼凑出一个解决方案。35列代表什么?请允许我说得更多具体的下面是Excel日志表中的两列:日期车辆\u ID车辆\u类型路线\u NR从到总计\u时间工具\u a\u时间工具\u B\u时间停车里程汽油备注船员\u姓名。。。我主要关心的是数据库的大小/速度。。。。什么是最有效的结构。多面体,谢谢你的布局。这意味着员工将拥有25000行,而活动每天将拥有75000行(基于每个用户每天3个活动)。活动不是会在很短的时间内发展到一个巨大的规模吗?听起来很疯狂+1.Flukyspore,在您的35列中,与特定活动相关的列(例如,
    小时
    )然后进入活动表。与特定日期有关的内容进入日期表(例如,
    假日
    )。这样,当你的5000名员工在7月4日工作时,你可以算出他们是在假日工作的,不管他们是否亲自将该日期标记为假日。你的35个专栏中至少有一个可能是这样的。@yi_H:我完全不同意。在许多应用程序中,拥有一个天表(以及一个每秒钟一行的时间表)非常有意义。+1但您甚至可以更进一步,创建一个类别表,其中包含:id、title、description,然后在活动表中包含categoryID。这样就不必一次又一次地写活动名称/描述,从而节省空间。好的,Thx,我关心的是数据库的大小和速度。我对数据库的最大容量不是很熟悉。每月活动表。。。一个数据库可以容纳的表的限制是什么?一个数据库可以容纳的表的最大数量是不同的,但我认为可以肯定地说,在这成为一个问题之前,您更有可能遇到其他瓶颈。无论如何,根据@Flimzy的模型,十年的数据只会产生120个表,这并不完全疯狂。使用这样的方案,假设只有最新的数据间隔是高度相关的,您最终可以将旧数据推入存档数据库,例如,每年有一个大的、较慢的表,而您的主数据库每月保持一年的表。@djacobson,谢谢。档案数据库将是困难的,因为我们计算员工在公司整个职业生涯的总数。。。每一天但我确实开始对如何建立数据库有了更清晰的了解。我只是有点担心桌子太多了。再次感谢。事实上,我错了。档案表是一个很好的主意,因为我可以制作一个包含每年总数的表格,用于每天的计算。以较慢的速度从存档中检索前几年的详细信息是可以的,因为这是一项更为罕见的操作。我建议你读一两本关于数据库设计的书。我读过的一篇相关文章是。关于这个主题可能有更好的书,但这本书给了我足够的信息,让我觉得我能够为我们的新项目提出一个核心设计,这对我们很有帮助。
    CREATE TABLE users (
        uid    INT,
        name   VARCHAR(255),
        ...
    );
    
    CREATE TABLE activities (
        uid    INT, // references users.uid
        type   VARCHAR(32),
        date   DATE,
        ... // The 35 activity-related columns
    );