postgres中的对称关系
Symmetric relationship in postgres
我一直在使用翻译 API,但建议缓存翻译,因为不必要的服务器访问,所以我将其缓存在 postgres 数据库中。
所以我创建了一个table
CREATE TABLE translation_cache(
src_lang_code CHAR(3),
dst_lang_code CHAR(3),
src VARCHAR,
dst VARCHAR NOT NULL,
PRIMARY KEY(src_lang_code, dst_lang_code, src)
);
这意味着,对于每个字符串 src
,只有一个从 src_lang_code
到 dst_lang_code
的翻译。但这是一个对称关系! dog (en) -> собака (ru); собака (ru) -> dog (en)
,没有别的办法!
有没有一种漂亮的方法可以在 postgres 中实现这种对称关系,或者我应该变得丑陋并复制数据?
没有非常好的解决方案。
您可以在需要查找翻译时搜索 table 两次,或者您可以添加一个触发器,在插入一行时添加第二个镜像行。
在第一种情况下,您应该添加一个唯一约束,不允许对同一对语言使用相同的 dst
。
让我补充一点,这个翻译模型过于简单化了。一个词很少对应于另一种语言中的单个词,因此这种关系通常不是对称的。
我一直在使用翻译 API,但建议缓存翻译,因为不必要的服务器访问,所以我将其缓存在 postgres 数据库中。
所以我创建了一个table
CREATE TABLE translation_cache(
src_lang_code CHAR(3),
dst_lang_code CHAR(3),
src VARCHAR,
dst VARCHAR NOT NULL,
PRIMARY KEY(src_lang_code, dst_lang_code, src)
);
这意味着,对于每个字符串 src
,只有一个从 src_lang_code
到 dst_lang_code
的翻译。但这是一个对称关系! dog (en) -> собака (ru); собака (ru) -> dog (en)
,没有别的办法!
有没有一种漂亮的方法可以在 postgres 中实现这种对称关系,或者我应该变得丑陋并复制数据?
没有非常好的解决方案。
您可以在需要查找翻译时搜索 table 两次,或者您可以添加一个触发器,在插入一行时添加第二个镜像行。
在第一种情况下,您应该添加一个唯一约束,不允许对同一对语言使用相同的 dst
。
让我补充一点,这个翻译模型过于简单化了。一个词很少对应于另一种语言中的单个词,因此这种关系通常不是对称的。