0

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

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

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

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

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

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

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

表格:

雇员:

  • ID
  • customer_id NULL(客户的 FK)
  • 供应商 ID NULL(供应商的 FK)
  • 名称
  • 名字
  • 电子邮件
  • 密码
  • user_type(客户或供应商)
  • 角色(经理或助理)

顾客:

  • ID
  • employee_id(员工的外键)
  • 公司名称
  • 联系人姓名

供应商:

  • ID
  • employee_id(员工的外键)
  • 公司名称
  • 联系人姓名

谢谢

4

1 回答 1

4

不要这样做,你会后悔的。使用派对模型和表继承。

各方之间存在关系,例如 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)
);
于 2013-06-06T19:40:06.573 回答