Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 表示约束的模型数据库_Database_Data Modeling_Entity Relationship - Fatal编程技术网

Database 表示约束的模型数据库

Database 表示约束的模型数据库,database,data-modeling,entity-relationship,Database,Data Modeling,Entity Relationship,我正在构建一个数据库(针对一个类)来为零件订购应用程序建模。“供应商”提供零件(不同的供应商可能各自提供一个或多个履行相同角色的零件,而每个零件恰好履行一个角色),“经理”决定哪些零件可以订购(只有一个履行给定角色的零件可以订购),用户可以订购零件 我目前处于E-R图绘制阶段。我不知道如何对部件、角色和订单进行建模。我可以将每个订单/角色表示为(概念上的)“客户零件”实体,并创建与“供应商零件”实体的两种关系: 这看起来非常俗气,到处都是“试用版创建”,但相信我,这比我的鸡抓笔迹要好 然而,这

我正在构建一个数据库(针对一个类)来为零件订购应用程序建模。“供应商”提供零件(不同的供应商可能各自提供一个或多个履行相同角色的零件,而每个零件恰好履行一个角色),“经理”决定哪些零件可以订购(只有一个履行给定角色的零件可以订购),用户可以订购零件

我目前处于E-R图绘制阶段。我不知道如何对部件、角色和订单进行建模。我可以将每个订单/角色表示为(概念上的)“客户零件”实体,并创建与“供应商零件”实体的两种关系:

这看起来非常俗气,到处都是“试用版创建”,但相信我,这比我的鸡抓笔迹要好

然而,这里有一个关键的约束条件是无法捕捉到的。假设您有两套供应商零件,每一套都履行一个角色。每组零件(每个角色)将由一个客户零件表示。但是,该模型不能保证客户部件将对应于在“订单”关系中履行正确角色的部件

我也尝试过用三元关系和聚合对其进行建模,但我仍然无法捕获所有约束

我的问题归结为:我有部件、角色和订单。角色和医嘱内容映射到1-1和上,并且可以真正合并到单个实体中。我如何表示每个部分与一个角色关联,每个角色与一个医嘱内容关联,反之亦然,并且每个医嘱内容与一个部分关联,该部分也与对应于该医嘱内容的角色关联

感谢您提供的任何见解

suppliers
---------
PK supplier_id

parts -- 1-1 part to role
-----
PK part_id
FK role_id

stocks -- suppliers' parts
------
PK stock_id
FK supplier_id
FK part_id

roles
-----
PK role_id

managers
--------
PK manager_id

selections -- part selected by a manager for a role
----------
PK selection_id
FK manager_id
FK role_id
FK part_id

LEGEND: PK = Primary Key (assuming SERIAL PRIMARY KEY), FK = Foreign Key

您也可以将
FK part_id
添加到
角色
中,而不是
选择
表。我有点赶时间,可能在您的需求中迷失了方向。(但要非常清楚地说明它们,请加1。)让我们先解决简单的问题。我在这里主要使用自然关键点,因为自然关键点更容易看到发生了什么。我认为,对您来说真正重要的部分是重叠的外键约束(接近末尾)

简单的东西——零件表、供应商表和角色表

create table test.parts (
  part_num varchar(15) primary key
);

insert into test.parts values 
('Part A'), ('Part B'), ('Part C');

-- "Suppliers" provide parts.
create table test.suppliers (
  supplier_name varchar(35) primary key
);

insert into test.suppliers values
('Supplier A'), ('Supplier B'), ('Supplier C');

create table test.roles (
  role_name varchar(15) primary key
);

insert into test.roles values
('Role 1'), ('Role 2'), ('Role 3');
一个要求:每一部分都只履行一个角色。(有关唯一约束的更多信息,以及关于使用此表而不是稍后简单地向“零件”添加列的更多信息。)

另一个要求——每个供应商可以提供一个或多个履行相同职责的零件。我认为这简化为“每个供应商提供多个零件”。(存储零件所属角色的事实是另一个表的责任。)

另一个要求——经理决定哪些零件可以订购。(使用GRANT和REVOKE处理管理器。)只能订购一个完成给定角色的部件。(这意味着主键约束或角色名称的唯一约束。)并且除非有人提供零件,否则不能订购零件。(因此我们需要重叠的外键约束。)

这就是我前面提到的test.part_角色(part_num,role_name)的唯一约束的作用

create table test.orderable_parts (
  role_name varchar(15) primary key references test.roles,
  part_num varchar(15) not null,
  foreign key (part_num, role_name) 
    references test.part_roles (part_num, role_name),

  supplier_name varchar(35) not null,
  foreign key (supplier_name, part_num) 
    references test.supplied_parts (supplier_name, part_num)
);

insert into test.orderable_parts values
('Role 1', 'Part A', 'Supplier A'),
('Role 2', 'Part C', 'Supplier A');

我认为你最好有一个单独的角色表。(例如,比在零件上添加栏要好。)供应商通常提供的零件比您现在感兴趣的零件多,但企业通常希望提前计划,在承诺使用零件之前收集有关零件的信息(在您的情况下,在特定角色中)。

谢谢!这应该很好地满足要求。荣誉
create table test.supplied_parts (
  supplier_name varchar(35) not null 
    references test.suppliers (supplier_name),
  part_num varchar(15) not null references test.parts (part_num),
  primary key (supplier_name, part_num)
);

insert into test.supplied_parts values
('Supplier A', 'Part A'),
('Supplier A', 'Part B'),
('Supplier A', 'Part C'),
('Supplier B', 'Part A'),
('Supplier B', 'Part B');
create table test.orderable_parts (
  role_name varchar(15) primary key references test.roles,
  part_num varchar(15) not null,
  foreign key (part_num, role_name) 
    references test.part_roles (part_num, role_name),

  supplier_name varchar(35) not null,
  foreign key (supplier_name, part_num) 
    references test.supplied_parts (supplier_name, part_num)
);

insert into test.orderable_parts values
('Role 1', 'Part A', 'Supplier A'),
('Role 2', 'Part C', 'Supplier A');