sql - 动态多语言数据结构的数据库设计模式

标签 sql database design-patterns database-design language-agnostic

到目前为止,我已经用几种不同的方式完成了这项工作。我想知道是否有一个好的模式。

系统具有动态内容。因此,不仅数据量和数据本身是动态的(计数(行)),而且字段数也是动态的。因此,博客可能有 10 个字段需要翻译,但购物车项目有 5 个。

我一直在为表行插入一个 id,该表行包含该字段的语言数据。这个语言表有 id、defaultlanguage 以及任意数量的附加语言。这样就只有一个语言表。

这很好,但我无法更新 View ,因为当多个连接引用同一个表时,它是不可更新的 (MySQL)。那么也许有更好的方法来做到这一点。

还有更好的设计吗?在这种情况下使用的一些常见设计模式是什么?

最佳答案

  • 实体字段类型(ID名称)
  • 实体字段(ID名称FieldType)
  • 实体FieldValues(IDCollectionIDFieldValue)
  • 实体内容(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/

相关文章:

sql - Ruby on Rails : joining two tables on something other than the standard foreign key

SQL:仅当该单元格具有给定 ID 的最大值时才选择一行

sql - 如果利润小于项目成本的 55%,如何编写这个 select 语句?

android - android中使用的设计模式是什么?

mysql - SQL : error with an inner join, 可能很简单

java - 无法从 SQLite 数据库中选择图像 (Android)

Python Pandas - 将 csv 文件转换为特定格式

Java、FTP 和多个消费者

ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式?

php - 使用外键从表中获取数据?