客户,供应商及其员工

时间:2013-06-06 16:48:32

标签: mysql database database-design relational-database database-schema

我正在设计一个客户可以从供应商处订购产品的市场。我需要帮助来定义数据库方案。

我有两种类型的公司:客户和供应商。供应商可以拥有自己的客户(一个客户可以属于许多供应商)。客户和供应商都可以拥有自己的员工:可以根据用户角色登录应用程序和访问表的经理和助理,并且只能访问他们所属公司的记录。

注册申请时,用户必须在注册表中选择用户类型(客户或供应商),然后在注册后,他/她自动获得“经理”角色。之后,作为经理,他们可以添加公司信息和员工。只有经理可以将公司信息和员工添加到系统中。

客户和供应商可以拥有不同的公司属性,这就是我将它们分成两个表的原因。

  1. 我为此方案创建了以下架构,但不确定这是正确的方法。什么是更好的解决方案?

  2. 这种情况会产生另一个问题:当经理注册时,他们会被添加到Employee表中,但此时他们还不属于任何公司,因为他们没有添加他们的公司信息,因此他们没有在employee表中有customer_id或supplier_id。只有当他们添加公司信息时,他们才能获得新公司的客户或供应商ID(公司ID)。但是,为了将它们与公司关联,需要将此公司ID添加回员工表中的经理记录。我认为这不应该如何完成,但无法提出更好的解决方案。 我正在尝试使用Customers和Suppliers表中的“employee_id”来解决此问题。这样,当经理添加公司信息时,他们的“employee_id”将与公司信息一起保存在Customers或Suppliers表中。这种方式管理器将与公司一对一关联。这是一个经理只能访问他拥有的公司。之后,当管理人员将员工添加到公司时,由于公司已经存在,因此供应商或客户ID将与员工记录一起保存,因此变得更加容易。

  3. 如何以正确的方式做到这一点?

    TABLES:

    雇员:

    • id
    • customer_id NULL(客户FK)
    • supplier_id NULL(供应商的FK)
    • FNAME
    • L-NAME
    • 电子邮件
    • 密码
    • user_type(客户或供应商)
    • 角色(经理或助理)

    客户:

    • ID
    • employee_id(员工FK)
    • COMPANY_NAME
    • CONTACT_NAME

    生产商:

    • ID
    • employee_id(员工FK)
    • COMPANY_NAME
    • CONTACT_NAME

    谢谢

1 个答案:

答案 0 :(得分:4)

不要这样做,你会后悔的。使用Party Model和Table Inheritance。

各方之间存在关系,例如Frank是Acme Inc.的组织联系人或Jim是BizCo的员工。

对于您可能没有关系的人,您也可以使用“申报的角色”,例如尚未与您开展业务的潜在客户或供应商。

由于以下原因,此架构是有利的:

  • 您可以(通过销售订单)向个人或组织销售(使用一个外键)
  • 一方可以同时扮演多个角色/拥有多个关系
  • 没有重复

在此处使用单表继承,但如果您不喜欢空值,则可以使用类表继承。在这里使用PostgreSQL样式的SQL,但很容易调整MySQL。

create table party_type (
  id int primary key,
  description text not null unique
);

insert into party_type values
(1, 'Individual'),
(2, 'Organization');


create table party (
  id serial primary key,
  type int not null references party_type(id),
  organization_name text null,
  first_name text null,
  last_name text null
);



create table party_relationship_type (
  id int primary key,
  description text not null unique
);

insert into party_relationship_type values 
(1, 'Organization Contact'),
(2, 'Employment');


create table party_relationship (
  from_party_id int not null references party(id),
  to_party_id int not null references party(id),
  type int not null references party_relationship_type(id),
  primary key (from_party_id, to_party_id, type),
  check (from_party_id <> to_party_id)
);

/* note: no check constraints in mysql, you will have to use a trigger, or use Postgres. Don't need roles, but can be handy */

create table party_role_type (
  id int primary key,
  description text not null unique
);

insert into party_role_type values 
(1, 'Customer'),
(2, 'Supplier');


create table party_role (
  party_id int not null references party(id),
  party_role_type_id int not null references party_role_type(id),
  primary key (party_id, party_role_type)
);