嗨,所以我正在查看一个包含现有表格的多个转换表的遗留数据库。
所以有一个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中定义关系的方法。
不在数据库中定义关系会不会很糟糕?
我能想到的唯一解决方案是尝试将String外键添加到需要翻译的每个表(aaa.bbb.ccc.ddd)中。
目前,我已经废除了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;
答案 0 :(得分:2)
就个人而言,我认为没有在数据库中定义关系没有任何问题。在我工作的大型投资银行之前,我的Oracle专家从不为性能原因定义关系。
您的设置的基本问题是,您是否需要定义数量的语言,或者您是否必须灵活地在以后添加语言?如果没有,你的方法几乎过于灵活。如果你知道你只需要4种不同的语言,那么只需在Laws表中添加不同的行就可以提高性能。
或者,你可以建立一个锁定表:
original-string - >翻译字符串
你可以完全忽略表名。