【问题标题】:MySQL multidimensional arraysMySQL 多维数组
【发布时间】:2011-01-26 21:14:37
【问题描述】:

使用 MySQL 存储动态数据的最佳方式是什么?假设我有一个表,其中一个项目是“动态的”。对于某些条目,我需要存储一个值,但对于其他条目,它可能是一百个值。例如,假设我有以下简单表格:

CREATE TABLE manager
( 
name char(50),
worker_1_name(50),
worker_2_name(50),
...
worker_N_name(50)
);

显然,这不是建立数据库的理想方式。因为我必须容纳经理可能拥有的最大组,所以我在数据库中浪费了大量空间。我更喜欢有一个表,我可以将它用作另一个表的成员(就像我在 C++ 中通过继承所做的那样),“经​​理”表可以使用它来处理可变数量的员工。它可能看起来像这样。

CREATE TABLE manager
( 
name char(50),
underlings WORKERS 
);

CREATE TABLE WORKERS 
( 
name char(50),
);

我希望能够为每个经理添加可变数量的工人。这是可能的吗,或者我是否受限于枚举所有可能的员工数量,即使我很少使用完整的补充?

【问题讨论】:

    标签: mysql multidimensional-array


    【解决方案1】:

    一般来说,您应该执行以下操作:

    CREATE TABLE managers ( 
        manager_id int,
        name       char(50)
    );
    
    CREATE TABLE workers (
        name       char(50),
        manager_id int
    );
    

    这就是您应该在relation model 中表示“可变数量的工人”的方式。

    【讨论】:

    • 这是专门的database normalization。该关系模型链接中提到了它,但要找到它是一个相当大的页面。
    【解决方案2】:
    select w.name from worker w, manager m, managerWorkerMapping mwm
    where m.name = 'manager name' and
          m.id = mwm.managerid and
          w.id = mwm.workerId
    

    【讨论】:

    • 你能提供一些解释吗?您所做的事情根本不同,为什么它是 OP 的解决方案?
    • @cliff -- 虽然查询语句很有帮助,但请考虑将其添加到现有答案中。它本身并不能回答 OP 提出的问题。
    • the other answer 的完全相同的副本。
    【解决方案3】:

    您可以创建一个中间映射表。类似于以下内容:

    manager(id, name)
    managerWorkerMapping(managerId, workerId)
    worker(id, name)
    

    现在,要获取特定经理的所有工作人员,您可以运行以下查询:

    select w.name from worker w, manager m, managerWorkerMapping mwm
    where m.name = 'manager name' and
          m.id = mwm.managerid and
          mwm.workerId = w.id
    

    请务必注意,使用此架构,工作人员也可以拥有多个经理。

    【讨论】:

      【解决方案4】:

      您可以为经理分配一个自动增量 ID,并使用外键将工作人员链接到它:

      manager
         id
         name
      
      worker
         id
         manager_id
         name
      

      【讨论】:

        【解决方案5】:

        您可以使用 ID 列将工作人员作为同一表中的记录来跟踪。

        CREATE TABLE manager
        (
        name char(50),
        id int
        );
        
        CREATE TABLE WORKERS
        (
        managerID int,
        name char(50)
        );
        

        在工作人员中允许重复的 managerID...当您想将特定工作人员分配给经理时,只需从工作人员中选择名称,其中 managerID=ID,它将返回该经理的所有工作人员。如果您需要更复杂的查找,也可以使用 Joins。

        【讨论】:

          猜你喜欢
          • 2012-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-14
          • 2010-12-24
          • 1970-01-01
          • 2014-12-21
          相关资源
          最近更新 更多