到目前为止,我已经用几种不同的方式完成了这项工作。我想知道是否有一个好的模式。
系统具有动态内容。因此,不仅数据量和数据本身是动态的(计数(行)),而且字段数也是动态的。因此,博客可能有 10 个字段需要翻译,但购物车项目有 5 个。
我一直在为表行插入一个 id,该表行包含该字段的语言数据。这个语言表有 id、defaultlanguage 以及任意数量的附加语言。这样就只有一个语言表。
这很好,但我无法更新 View ,因为当多个连接引用同一个表时,它是不可更新的 (MySQL)。那么也许有更好的方法来做到这一点。
还有更好的设计吗?在这种情况下使用的一些常见设计模式是什么?
最佳答案
- 实体字段类型(ID、名称)
- 实体字段(ID、名称、FieldType)
- 实体FieldValues(ID、CollectionID、Field、Value)
- 实体内容(ID、字段、数据)
- 实体 i18n(ID、字段、LanguageID、值)
例子:
insert into FieldTypes('S', 'string');
insert into FieldTypes('DT', 'date/time');
insert into Fields(1, 'Author', 'S');
insert into Fields(2, 'Created', 'D');
insert into i18n(1, 1, 'en', 'Author');
insert into i18n(2, 1, 'ru', 'Автор');
insert into i18n(3, 2, 'en', 'Created');
insert into i18n(4, 2, 'ru', 'Создано');
insert into Content(1, 2, 'Test data');
insert into FieldValues(3, 2, 1, 'Tester');
insert into FieldValues(4, 2, 2, '2011-03-20T12:20:00');
/* Display content fields in the user language */
select c.ID, f.ID, i.Value as FieldName, fv.Value as FieldValue
from Content c, FieldValues fv, Fields f, i18n i
where c.Fields = fv.CollectionID
and fv.Field = i.Field
and i.LanguageID = :UserLanguage
and c.ID = :ContentID
关于sql - 动态多语言数据结构的数据库设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4252759/