【问题标题】:Inserting into a relational structure插入关系结构
【发布时间】:2012-10-22 19:03:49
【问题描述】:

我们应该创建关系数据库,而不是平面结构。您创建与其他表有关系的表。您进行规范化以删除重复,并进行反规范化以提高性能。这一切都说得通。但是,我很难找到一个好的机制来插入关系结构。是否没有将记录插入关系结构的良好机制。有没有类似的东西:

INSERT INTO x LEFT JOIN y ON x.id = y.id VALUES(...)?

我能想到的最好的方法是一个存储过程:

INSERT INTO x
SELECT id FROM x (or @@id)
INSERT INTO y

这似乎与整个关系模型背道而驰......

它相当于没有连接的插入。我们是否会忍受不得不自己进行多项选择并将结果连接在一起?

【问题讨论】:

  • 如果要插入多个表,请使用多个 SQL 语句(即批处理语句)、存储过程或触发器。我不知道你说的没有好的机制是什么意思。
  • 好吧,如果您使用 Java,例如 Eclipselink 之类的 JPA 实现会为您执行此操作。
  • 要扩展@RedFilter 的评论,您可以包装多个操作,例如INSERTs,在单个事务中确保逻辑操作是原子的。你的第二个例子是一个完美的例子。请注意,失败的操作可能仍会留下痕迹,例如,如果您的第二个 INSERT 失败并且事务回滚了第一个 INSERT,则仍然会消耗一个标识值。
  • @RedFilter 在我看来这有点像说你不需要加入,你可以做多个选择并将它们连接在一起。对我来说,sql 会给你连接,但插入操作却不一样,这对我来说似乎很奇怪。
  • ANSI 标准 (2008) 显然允许在“有意义”时插入视图(即,可能不适用于包含聚合的内容),但它是可选的,并非所有供应商都实现了它(我知道 DB2 没有——但您可以定义“替代”触发器)。你还有什么推荐的?

标签: sql sql-server database insert relational-database


【解决方案1】:

规范化是为了消除重复,反规范化是为了改进 表现。

您进行标准化以删除某些类型的更新异常。您进行非规范化以提高 SELECT 性能,通常以牺牲更新性能和更新异常为代价。

关系模型本身不仅支持可更新视图,它需要可更新视图。但据我所知,这仍然是一个研究领域;技术问题很严重,尤其是在大多数情况下您必须支持对视图的更新时。

当前的 SQL 产品最多只能提供有限的支持。 (而且 SQL 离关系型还有很长的路要走。)多年来,我想我们都已经开始期望如果我们想要可更新的视图就必须编写触发器。

在某些时候,无论您是在应用程序代码、触发器还是存储过程中执行此操作,您都会发现自己被包含在事务中的多个 INSERT 语句困住了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2015-09-21
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多