参照完整性和翻译
Referential Integrity and Translations
描述
您好,我正在查看一个遗留数据库,其中包含针对现有 table 的多个翻译 table。
所以有一个laws
table,但是还有一个translation_laws
table:
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。
问题:
- 有关于如何在使用整数 ID 时定义关系的想法吗??
不在数据库中定义关系会不会很糟糕?
我能想到的唯一解决方案是尝试向每个需要唯一翻译 (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 这个名字。
描述
您好,我正在查看一个遗留数据库,其中包含针对现有 table 的多个翻译 table。
所以有一个laws
table,但是还有一个translation_laws
table:
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。
问题:
- 有关于如何在使用整数 ID 时定义关系的想法吗??
不在数据库中定义关系会不会很糟糕?
我能想到的唯一解决方案是尝试向每个需要唯一翻译 (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 这个名字。