【问题标题】:How to Map Database Lookup Tables Automatically on Insert (Oracle)如何在插入时自动映射数据库查找表 (Oracle)
【发布时间】:2011-10-06 09:17:09
【问题描述】:

我现有的表几乎是非规范化的。没有针对事物列表状态、类型、国家/地区等的查找表...最初的设计只是为了简化应用程序对数据库的访问,因此这种非规范化没有性能原因。

这导致表格包含大量重复数据,我想通过为各种状态/类型/国家列引入查找表来正确规范化。

我是否可以在数据库 (oracle) 中执行此操作,并且对客户端保持透明? 应用程序将继续执行插入操作,但数据库会将内容映射到场景。

我一直在尝试组合使用视图和触发器来进行映射,但感觉应该有一种更自动的方式来执行此操作。

【问题讨论】:

    标签: sql oracle normalization denormalization lookup-tables


    【解决方案1】:

    在一般情况下,如果您可以创建可更新的视图,则可以使您的更改对用户透明。

    1. 将基表标准化为 3NF、BCNF 或 5NF。
    2. 重命名原始基表。
    3. 构建具有相同名称、列和行的可更新视图 原始的非规范化基表。
    4. 确保新视图的权限与 对原始基表的权限。
    5. 测试。
    6. 重复直到完成。

    任何尝试 SELECT、INSERT、UPDATE 或 DELETE 原始基表的客户端软件将改为访问可更新视图。 (这是因为表和视图共享一个命名空间,这不是偶然的。) dbms 和您的支持代码将确保正确的事情发生。

    根据您的平台和分解,构建可更新视图可能很容易,也可能不可能。在 Oracle 上,我认为最坏的情况是您必须编写 INSTEAD OF 触发器来支持所有查询操作。这还不算太糟糕。

    但是基于几个月的 SO,我不得不说我不是 100% 相信你真的需要这样做,或者你真的想这样做。将表的 DDL 和代表性示例数据发布为 SQL INSERT 语句,我们可以提供更好、更具体的建议。

    【讨论】:

    • 感谢您的精彩总结。这是我一直在尝试的基本方法,但我希望有一些魔法可以让它变得更容易,所以我不必成为 PL/SQL 专家。
    • @James “我希望有一些魔法可以让它变得更容易,所以我不必成为 PL/SQL 大师。”我想要一匹小马。可悲的事实是,从一开始就正确地做事需要付出努力。更可悲的事实是,在飞行途中对大泥球应用严谨和设计需要更多的努力。好消息是,我们随时为您提供帮助。
    • 我不想要小马。不过,我的狗已经老了。
    • @APC 我想 RDBMS 的主要吸引力在于,对我来说,它主要是声明性的,所以在数据库中添加一堆过程逻辑并不像是正确的事情,尽管小马.
    • @James Scriven:从关系的角度来看,这不是正确的事情,但从 SQL 的角度来看,这是唯一(有效的)事情。根据经验,SQL dbms 不能很好地支持可更新视图。
    猜你喜欢
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2011-12-30
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多