多值属性是任何面向数据库的应用程序的常见方案。常见用例之一是添加一个新实体,该实体进入两个表并通过其外键连接。
例如,新员工在工作的第一天就添加到系统中,在该系统中,她/他开始在公司的某个团队下工作。此人的记录保存在两个表中,一个表存储员工的个人信息(employee
),而其他表(employee_team
)存储每个团队在整个团队中员工在整个团队中的工作时间。公司。员工管理系统有一个新员工的长格式(这只是代表用例的一个例子),它吸收了所有员工信息,包括此人开始与之合作的部门。为了将此信息插入到两个表中,这些表显然是使用外键属性关联的。
实现这种情况的一种方法是使用Begin Transaction
和Commit
并在应用程序之间进行两次插入查询。另一个解决方案可以创建一个参数化的存储过程,并从应用程序中对该过程进行一次调用。
从数据库的角度来看,两种解决方案都可能导致数据库服务器中的活动相同。但是,可以公平地说,从应用程序的角度来看,前一种解决方案可能比第二种解决方案花费更多时间进行两次通信?每个程序的优缺点是什么?从数据库的角度和应用程序的角度来看,使用一个方法比另一个方法有什么好处?
我当前的系统基于PHP
和MySql
,但是我想,这种情况对于所有类型的RDBMS都是常见的。
答案 0 :(得分:0)
如果您的应用程序发送了一个查询即
BEGIN TRANSACTION
--INSERT 1
--INSERT 2
END TRANSACTION
然后它仍然是对数据库的一次调用,它恰好在做两件事,并且基本上等效于(忽略有关查询计划的细节等)调用单个存储过程...
编辑::正如我所说,这取决于您使用的产品,但是例如在Microsoft SQL Server中,您可以这样做
INSERT INTO [Table] ([Name]) VALUES ('Bob');
INSERT INTO [Table2] ([Table1Id]) VALUES (SCOPE_IDENTITY());
答案 1 :(得分:0)
听起来像事务和存储过程是解决同一问题的两种不同方法。他们不是。为了确保两个参与表之间的数据一致性,您仍然需要在存储过程中使用事务。
现在,很明显,如果您在客户端中为BEGIN TRANSACTION
,SELECT...
,INSERT...
,COMMIT
发出单独的语句,则会产生更多消息与将整个事情作为一个复合SQL语句发出来回来回去相反,但是无论如何,网络通信很少会成为数据库性能的瓶颈。