参照完整性和翻译

时间:2017-06-27 08:29:17

标签: oracle bundle translation

描述

嗨,所以我正在查看一个包含现有表格的多个转换表的遗留数据库。

所以有一个laws表,但是还有一个translation_laws表:

Laws (law_id, inForceDate, type, etc)
Translation_Laws (law_id, lang_code, translation)

还有一个law_type表:

Law_Type (law_type_id, description, isDecreed, etc.)

Translation_Law_Type(law_type_id, lang_code, translation)

因此,使用以下方案可以保持参照完整性,但最终会有多个转换表。

我更愿意使用以下格式创建一个表:

translations(table_name, id, lang_code, translation)`

这基本上就像bundle, key, lang_code, label。我还可以将bundle+key+lang_code合并到一个varchar键中:bundle.key.lang_code

但是,我没有看到很多在Oracle SQL中定义关系的方法。

问题:

  1. 任何想法如何在使用整数ID时定义关系?
  2. 不在数据库中定义关系会不会很糟糕?

    我能想到的唯一解决方案是尝试将String外键添加到需要翻译的每个表(aaa.bbb.ccc.ddd)中。

  3. 更新

    目前,我已经废除了DB中的官方关系,并制定了以下类型的架构:

      CREATE TABLE TRANSLATIONS(
        DESCRIPTION_ENTITY VARCHAR(30) NOT NULL,
        DESCRIPTION_COLUMN VARCHAR(30) NOT NULL,
        KEY_OR_ID VARCHAR(30) NOT NULL,
        LANG_CODE VARCHAR(2),
        TEXT CLOB,
        -- Legacy are To be able to cross check using columns - but not needed
        LEGACY_TABLE VARCHAR(30) NOT NULL,
        LEGACY_COLUMN VARCHAR(30) NOT NULL);
    
        ALTER TABLE TRANSLATIONS
          add CONSTRAINT UNIQUE_COMBINATION UNIQUE (DESCRIPTION_ENTITY, DESCRIPTION_COLUMN, KEY_OR_ID, LANG_CODE);
    
        CREATE INDEX ind_description_entity ON TRANSLATIONS (DESCRIPTION_ENTITY);
        CREATE INDEX ind_description_column ON TRANSLATIONS (DESCRIPTION_COLUMN);
        CREATE INDEX ind_key_or_id ON TRANSLATIONS(KEY_OR_ID);
        CREATE INDEX ind_lang_code ON TRANSLATIONS(LANG_CODE);
    
        insert into TRANSLATIONS(DESCRIPTION_ENTITY, DESCRIPTION_COLUMN, KEY_OR_ID, LANG_CODE, TEXT, LEGACY_TABLE, LEGACY_COLUMN)
        select 'LAW','TITLE', LAW_CODE, LANG_CODE, LAW_TITLE,
          'LAW_TRANS','TITLE'
        from LAW_TRANS where TITLE is not null;
    

1 个答案:

答案 0 :(得分:2)

就个人而言,我认为没有在数据库中定义关系没有任何问题。在我工作的大型投资银行之前,我的Oracle专家从不为性能原因定义关系。

您的设置的基本问题是,您是否需要定义数量的语言,或者您是否必须灵活地在以后添加语言?如果没有,你的方法几乎过于灵活。如果你知道你只需要4种不同的语言,那么只需在Laws表中添加不同的行就可以提高性能。

或者,你可以建立一个锁定表:

  

original-string - >翻译字符串

你可以完全忽略表名。