【问题标题】:Mysql tables into one tableMysql表并入一张表
【发布时间】:2012-07-07 20:31:00
【问题描述】:
CREATE TABLE emp_u (
        id      INT NOT NULL AUTO_INCREMENT,
        emailAddress    VARCHAR(100) NOT NULL,
        username        VARCHAR(30) NOT NULL,
        passwd          VARCHAR(40) NOT NULL,
        title           CHAR(4) NOT NULL,
        firstName       VARCHAR(50) NOT NULL,
        surname         VARCHAR(50) NOT NULL,
        PRIMARY KEY (id),
        UNIQUE KEY(emailAddress),
        UNIQUE KEY(username),
        KEY idx_fullname (firstName, surname)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE emp_u_p (
    employer_id_fk  INT NOT NULL DEFAULT 0,
    s_mgt           TINYINT(1) NOT NULL DEFAULT 0,
    add_j_mgt       TINYINT(1) NOT NULL DEFAULT 0,
    edit_j_mgt      TINYINT(1) NOT NULL DEFAULT 0,
    del_j_mgt       TINYINT(1) NOT NULL DEFAULT 0,
    j_mgt           TINYINT(1) NOT NULL default 0,
    cp_mgt  TINYINT(1) NOT NULL default 0,
    ph_mgt      TINYINT(1) NOT NULL default 0,
    cb_mgt      TINYINT(1) NOT NULL default 0,
    search_mgt      TINYINT(1) NOT NULL default 0,
    PRIMARY KEY (employer_id_fk)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

我的数据库中有这两个表。将这两个表组合在一起会更好,或者保持原样。

我是数据库新手,只是为我的 mysql 写了一些表。

【问题讨论】:

  • 您将这些表用于什么用途? empemployee 的缩写吗?
  • 两者的主键相同吗?如果是,您可以合并它们
  • 它们将用于雇主登录系统并设置它们以获得不同的权限
  • 您能(只是为了我们的利益)将所有晦涩的名称更改为语义名称吗?即将emp_u_id更改为employee_user_id之类的?
  • 是的,两个故事的主键是相同的,因为它们只是每个雇主的一个记录,我不需要创建另一个 id 记录

标签: mysql mysql5


【解决方案1】:

如果我们建议进行规范化(总是!),那么我建议您将它们保留为两个表,但将权限表的性质更改为一对多而不是像看起来那样的 1-1现在。

员工表中每个员工应该有一行,然后权限表中每个权限一行。

CREATE TABLE emp_u_p (
 emp_u_id INT NOT NULL DEFAULT 0,
 permission_name varchar
);

当您需要向系统添加权限类型时,这是非常有利的;您将不需要重构您的架构。如果你真的想一路走下去,做第三个表叫做“权限”,然后有一个多对多,你的employee_permissions表只有两个外键:一个用于employee_id,一个用于permission_id

要选择具有给定权限的员工:

SELECT emp_u.* 
FROM emp_u JOIN emp_u_p 
  ON emp_u.id = emp_u_p.emp_u_id 
  AND permission_name = "add_j_mgt";

【讨论】:

  • 所以让表格保持原样,只需在这些字段中输入相同的数据,例如1, add_j_mgt, '1'
  • 嗯,有点。你的第二个表的结构会改变(到我在这里展示的 DDL),然后是的,其中会有 1 行 PER 权限。
  • 我稍微修改了一下,因为你不需要这个关系的启用位...简单的行的存在表明权限被启用(删除行删除权限)
  • 好的,因为我的管理表有相同的布局,然后我应该创建一个表并将其称为权限,并让他们可以 id、permission_name、who_is_user
【解决方案2】:

正如您的表格所代表的,第一个表格包含员工的基本信息,第二个包含该员工的权限...我认为,两个表格之间应该有关系foreign relationship...您可以使用ID员工在第二张表中作为foreign key...它将维护数据库属性.....所以,我建议您使用带有foreign relationship的两个表......

【讨论】:

  • 需要注意的是,MyISAM 不支持这些约束(这可以由你的代码处理)。您应该使用 InnoDB 让 MySQL 为您强制执行关系。
  • 我已经有一个外键employee_id_fk 是我在emp_u_p 表中的键
  • @ctrahey 没错,因为我使用的是 MyISAM,我无法在每个表之间输入约束
  • 我假设,OP 正在开发 MySQL 5.5,其中 Innodb 是默认存储引擎.....
  • 我强制将我的数据库设置为 ENGINE=MyISAM DEFAULT CHARSET=utf8;
猜你喜欢
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多