数据库模型规范化 - 数据完整性

时间:2015-03-06 23:12:05

标签: database-design erd data-integrity

这是我的问题,我有2个基本实体。

1-Order and 2交付类型(基本上是查找表1 - 电子邮件,2下载,3-USPS邮件)

假设客户下订单并选择3-USPS邮件类型。

我的订单表存储要加入交付类型的ID 3。基本的东西。

但是当管理员错误地将交付类型从UPS邮件更新到Fedex Mail时会发生什么。

订单将反映错误的交货类型。 我的问题是,我们是否应该阻止人们在订单到位后更新交付类型,或者我的订单应该非规范化并在那时存储文档类型的快照,这是什么最好的做法?

我在订单 - 产品方案中看到大部分时间,更新产品名称并不是什么大不了,但是当新值影响订单时,实施的程序是什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

这完全取决于您在那里实现自动化的业务流程。如果他们不能做到,并且没有商业理由去做,那么就应该阻止他们去做。如果他们需要这样做,那么系统需要能够处理它。这是你从一开始就需要建模的东西,以防止陷入无法摆脱的漏洞。

所以,没有它,没有坚定的答案。您的数据需要与当前正在进行的订单相匹配,这是肯定的。

答案 1 :(得分:0)

  

但是当管理员错误地将交付类型从UPS邮件更新到Fedex Mail时会发生什么。

不要让这种情况发生。权限是数据库设计的一部分,下面使用PostgreSQL进行说明。原则适用于所有客户端/服务器SQL dbms。

create table delivery_types (
  delivery_type_num integer not null primary key,
  delivery_type_name varchar(15) not null unique
);

insert into delivery_types values
(1, 'Email'), (2, 'Download'), (3, 'USPS Mail');

create table orders (
  order_num integer primary key,
  other_columns char(1) not null default 'x',
  delivery_type_num integer not null references delivery_types
    on delete no action on update no action
);

revoke insert, update, delete, truncate on delivery_types from public;
grant select on delivery_types to public;

通过从“public”角色撤消这些权限,只有所有者和数据库超级用户可以更新该表。 “orders”中的外键引用将阻止所有者和数据库超级用户删除行或更新其他表引用的行的 id number 。

略有不同的方法使用自然键。这不是非规范化。两个表“delivery_types”都在6NF。

create table delivery_types (
  delivery_type varchar(15) primary key
);

insert into delivery_types values
('Email'), ('Download'), ('USPS Mail');

create table orders (
  order_num integer primary key,
  other_columns char(1) not null default 'x',
  delivery_type varchar(15) not null references delivery_types
    on delete no action on update no action
);

revoke insert, update, delete, truncate on delivery_types from public;
grant select on delivery_types to public;

insert into orders values 
(1, 'x', 'Email'), (2, 'x', 'Download'), (3, 'x', 'USPS Mail');

权限与以前一样工作 - 角色“public”的成员可以从delivery_types中进行选择,但他们无法更改内容。但是现在甚至数据库超级用户也无法删除或更新delivery_types中的行。外键引用阻止了它。