我正在设计一个客户可以从供应商处订购产品的市场。我需要帮助来定义数据库方案。
我有两种类型的公司:客户和供应商。供应商可以拥有自己的客户(一个客户可以属于许多供应商)。客户和供应商都可以拥有自己的员工:可以根据用户角色登录应用程序和访问表的经理和助理,并且只能访问他们所属公司的记录。
注册申请时,用户必须在注册表中选择用户类型(客户或供应商),然后在注册后,他/她自动获得“经理”角色。之后,作为经理,他们可以添加公司信息和员工。只有经理可以将公司信息和员工添加到系统中。
客户和供应商可以拥有不同的公司属性,这就是我将它们分成两个表的原因。
我为此方案创建了以下架构,但不确定这是正确的方法。什么是更好的解决方案?
这种情况会产生另一个问题:当经理注册时,他们会被添加到Employee表中,但此时他们还不属于任何公司,因为他们没有添加他们的公司信息,因此他们没有在employee表中有customer_id或supplier_id。只有当他们添加公司信息时,他们才能获得新公司的客户或供应商ID(公司ID)。但是,为了将它们与公司关联,需要将此公司ID添加回员工表中的经理记录。我认为这不应该如何完成,但无法提出更好的解决方案。 我正在尝试使用Customers和Suppliers表中的“employee_id”来解决此问题。这样,当经理添加公司信息时,他们的“employee_id”将与公司信息一起保存在Customers或Suppliers表中。这种方式管理器将与公司一对一关联。这是一个经理只能访问他拥有的公司。之后,当管理人员将员工添加到公司时,由于公司已经存在,因此供应商或客户ID将与员工记录一起保存,因此变得更加容易。
如何以正确的方式做到这一点?
TABLES:
雇员:
客户:
生产商:
谢谢
答案 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)
);