Database i18n的FuelPHP ORM数据库模式,意见/建议

Database i18n的FuelPHP ORM数据库模式,意见/建议,database,orm,internationalization,fuelphp,Database,Orm,Internationalization,Fuelphp,虽然这个问题可能是,但我想就i18n的最佳方法征求意见/建议,特别是在FuelPHP上 以下是我到目前为止得到的信息: 数据库模式#1: models (id, name_pt, name_es, name_en, description_pt, description_es, description_en) (1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model desc

虽然这个问题可能是,但我想就i18n的最佳方法征求意见/建议,特别是在FuelPHP上

以下是我到目前为止得到的信息:

数据库模式#1:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)
-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')
样本数据#1:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)
-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')
优点:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)
-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')
  • 直率
  • 每个型号一张表
  • 不需要使用JOIN
  • 使用神奇的方法简化数据访问:

这样,我就可以打电话:

$model->name;
$model->description;
而不是:

$model->{'name_'.Session::get('lang_code')};
$model->{'description_'.Session::get('lang_code')};
缺点:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)
-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')
  • 拥有大量的语言/翻译字段可能会变得混乱
  • 添加新语言意味着向表中添加新字段
  • 只有当我们已经有一个ORM实例/对象时,魔术方法才有效。要通过ordered by a translated字段获取ORM实例,仍然需要以下代码:

数据库模式#2:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)
-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')
样本数据#2:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)
-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')
优点:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)
-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')
  • 更好的数据组织
  • 添加一种新语言很简单
  • 与第一种方法一样,我们还可以使用填充$\u custom\u数据数组的方法进行直接数据访问:

缺点:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)
-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')
  • 复杂性增加
  • 必须使用联接或第二个查询
  • 每个型号都需要一个额外的表格
数据库模式#3:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)
-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')
在其他问题上,我看到有人建议对所有翻译使用中央i18n表,对模型的每个翻译使用一行

优点:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)
-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')
  • 模型间共享的i18n的单个表
  • 添加一种新语言应该像前面的方法一样容易
缺点:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)
-- languages
(1, 'pt', 'Português')
(2, 'es', 'Español')
(3, 'en', 'English')

-- models
(1)

-- i18n_models
(1, 1, 1, 'Modelo', 'Descrição do modelo')
(2, 1, 2, 'Modelo', 'Descripción del modelo')
(3, 1, 3, 'Model', 'Model description')
  • 获取数据时复杂性增加,需要为模型中的每个翻译文本进行连接
  • 我们可以尝试使用这种方法,尽管它使用键/值进行映射,但在这种情况下,我们还必须使用语言_id来获取正确的翻译

就个人而言,我更喜欢第二种方法。您还看到了哪些其他优点/缺点?有人在FuePHP上以不同的方式实现了i18n吗?分享您的想法:)

我只需在表中添加一个
lang
字段

然后我对该字段进行筛选:

SELECT * FROM articles WHERE lang = 'en'
我甚至在CRUD的管理部分使用它,用户可以在其中切换语言,他们可以看到该特定语言的所有条目

编辑将自动使用他所使用的语言处理内容

INSERT INTO articles VALUES('My Title', 'My Article', 'en')

只需从当前本地用户处获取“en”。(我允许他们改变形式来覆盖它)。

但这会让你为每一个语言写一篇不同的文章,而不是为每一篇文章写一篇不同的语言,我认为你的解决方案与他试图实现的相反(或者看起来是这样)