首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何表示具有数据库容量的集合?

如何表示具有数据库容量的集合?
EN

Software Engineering用户
提问于 2015-12-22 20:40:07
回答 2查看 323关注 0票数 4

关于一对多关系的规范化,我不知道如何在数据库中表示具有指定容量的集合。我可以想出两种方法来表示与B具有一对多关系的实体A:

  1. 当用n个容量创建表A时,将n行插入表B中。表B中的行数表示该集合的容量(如分配内存)。当元素被放置并从集合中移除时,必须更新这些行。
  2. 当用n个容量创建表A时,当元素被放置并从集合中移除时,必须将表A表示为A中的列,并将其从表B中插入和删除。应用程序确保表B的行数不超过n行。

每一种方式的利弊是什么?有什么标准的方法吗?是否存在性能或维护方面的问题?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2015-12-22 20:56:42

每一种方式的利弊是什么?

选项1有利于

  • 可以通过授予用户在B上的更新权限,但不授予insert或delete权限,从而在数据库级别强制执行。显然,特权用户(可能是存储过程)应该创建初始行。
  • 容量,作为A的一个属性,是A的一个列,这是有意义的。

选项1不利于

  • 据我所知没有。

选项2有利于

  • 容量,作为A的一个属性,是A的一个列,这是有意义的。

选项2不利于

  • 应用程序(或应用程序)必须强制执行可以在数据库级别轻松执行的业务规则。

Recommendation:

--两者的结合:

  • 将A的容量存储为A的一列。
  • 特权用户(后端)将在B中创建与A容量相同的行。
  • 普通用户不能从B中插入或删除,只需更新。
  • 当对A的容量进行更改时,后端插入或删除行,使行数与A的容量相匹配。

有一个标准的方法来做这个吗?

坦白说,我不这么认为。

是否存在性能或维护方面的问题?

选项2可以由于编程错误而造成不一致。

注:

没有“应用程序”这样的东西。单应用程序<->单DB规则现在不适用,因为你可能会在同一个后端有几个前端。

添加触发器以强制执行选项2:

的可能性:

不知道您的RDBMS是什么,但是这是一个伪代码:

代码语言:javascript
运行
复制
create trigger mytrigger before insert on table B for each row
declare
  var c integer;
  var ca integer;
begin
     select count(*) into c from B where id_a = :new.id_a;
     select capacity into ca from A where id = :new.id_a;
     if c > ca then
          RAISE_APPLICATION_ERROR(-20001, 'Cannot Insert mora than '||ca||' rows in this table');
     enf if;
end
票数 2
EN

Software Engineering用户

发布于 2015-12-22 20:54:59

至少有两个原因,选择2对我来说是赢家(虽然不确定这是否被认为是“标准”推理):

  1. 使用选项1,每次创建父实体的实例时,都会浪费默认添加的/空/空行。这不仅可能浪费资源,而且您可能经常需要对查询结果进行修剪才能解释这一点,并且可能会使任何存储过程代码变得更加丑陋。
  2. 从逻辑上讲,执行容量约束并不是DB的真正责任。只要父实体记录容量,您的模型就完成了。然后,正如您注意到的那样,这取决于应用程序,以确保模型的需求得到执行。
票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/305672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档