[英]How to structure a database for simple multilanguage website (PHP MySQL)?
一年多以前,我已经开发了一个网站。 内容曾经/现在是两种语言,现在我需要为它们构建一个数据库驱动的更新/数据插入系统,以插入一些新闻,事件等。这是创建此类表格的最佳方法:
news_id int(10) unsigned PK
lang_id int(2)
status tinyint(1)
title varchar(255)
title_en varchar(255)
title_es varchar(255)
content text
content_en text
content_es text
date_inserted datetime
date_modified datetime
type varchar(45)
atach text
然后为语言创建表格
对于任何一种特定的请求,您只应关心一种语言。 虽然您只能选择页面请求所需的语言,但以这种方式组织内容仍然不是最佳实践。
您应该做的是使用语言环境,并为内容提供默认值。 因为虽然您可能会认为您总是会创建一个内容的两个版本,但是在一个不太完美的世界中,这并不总是会发生。
因此,您首先要创建模型以反映这种关系。 为简单起见,我仅将其称为content
。 但是您当然可以将您的内容变成任何东西。
`content` (The Table)
id
status
title
content
dataCreated
dateModified
owner
`contentTranslations` (The Table)
id
contentId (FK)
locale
title
content
dateCreated
dateModified
现在,您只需要一种方法来知道用户希望使用哪个语言环境。 我更喜欢使用Zend_Locale来管理我的所有语言环境,而Zend_Translate则用于短键=>值转换。 (不过,这不适用于长内容翻译)。
当您知道要使用的语言环境时,只需执行查询以选择联接即可。
美丽
但是,所有这些功能的好处在于,如果您还没有为特定语言版本创建内容,那么您仍然可以默认并滚动到原始文章/内容所使用的基本语言。
SELECT c.id, c.status, c.title, c.content
FROM content as c
LEFT JOIN contentTranslations as t
ON c.id = t.contentId
WHERE c.id = 21231 AND t.locale = X
如果仅要使用两种语言,并且特定于语言的字段数量不多,则将所有内容保存在一个数据库中是可行的方法。
但是从长远来看,最好将其分为两个数据库,其中一个数据库保存不依赖于语言的数据,另一个数据库进行翻译。 这将使您将来可以轻松添加更多语言
“新闻”数据库:
news_id int(10)
status tinyint(1)
date_inserted datetime
date_modified datetime
type varchar(45)
atach text
“翻译”数据库:
translation_id int(10)
news_id int(10)
lang_id int(2)
title varchar(255)
content text
但是,在某些情况下这可能也会变慢。 不知道该网站获得了多少流量。
顺便说一句:因为我可以看到类型是varchar(45),所以我认为那也可能与语言有关?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.