参照完整性和翻译

Referential Integrity and Translations

描述

您好,我正在查看一个遗留数据库,其中包含针对现有 table 的多个翻译 table。

所以有一个lawstable,但是还有一个translation_lawstable:

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

还有一个law_type table:

Law_Type (law_type_id, description, isDecreed, etc.)

Translation_Law_Type(law_type_id, lang_code, translation)

因此,使用以下方案可以保持引用完整性,但最终会得到多个翻译 tables。

我希望制作一个 table 格式如下:

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. 不在数据库中定义关系会不会很糟糕?

    我能想到的唯一解决方案是尝试向每个需要唯一翻译 (aaa.bbb.ccc.ddd) 的 table 添加一个字符串外键。

更新

目前我已经取消了数据库中的官方关系并制作了以下类型的模式:

  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;

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

设置的基本问题是,您是否需要定义数量的语言,或者您是否必须在以后灵活地添加语言?如果不是,则您的方法几乎太灵活了。如果您知道您只需要 4 种不同的语言,那么只需添加不同的行并翻译成法律 table 就会提高性能。

或者,您可以建立一个锁定 table:

original-string -> translated-string

而且您可以完全忽略 table 这个名字。