适用于 i18n 的 FuelPHP ORM 数据库架构,意见/建议

2024-03-27

虽然这个问题可能是similar https://stackoverflow.com/questions/929410/what-are-best-practices-for-multi-language-database-design to https://stackoverflow.com/questions/316780/schema-for-a-multilanguage-database many https://stackoverflow.com/questions/1980214/how-to-support-multi-languages-approach-in-database-schema/ others https://stackoverflow.com/questions/9960241/i18n-using-database,我想就 i18n 的最佳方法(特别是 FuelPHP)征求意见/建议。

所以,这是我到目前为止所得到的:

数据库模式#1:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)

样本数据#1:

(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')

Pros:

  • 直接又简单
  • 每个型号一张表
  • 无需使用 JOIN
  • 使用魔术方法来简化数据访问:

 

public function & __get($property)
{
    if (array_key_exists($property, array('name', 'description')))
    {
        $property = $property.'_'.Session::get('lang_code');
    }

    return parent::__get($property);
}

这样,我就可以拨打电话:

$model->name;
$model->description;

代替:

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

Cons:

  • 有很多语言/翻译字段可能会变得混乱。
  • 添加新语言意味着向表中添加新字段
  • 这个魔术方法只有在我们已经有一个 ORM 实例/对象时才有效。通过以下方式获取 ORM 实例查询生成器 http://fuelphp.com/dev-docs/packages/orm/relations/intro.html按翻译字段排序,它仍然需要如下代码:

 

Model_Model::query()
    ->order_by('name_'.Session::get('lang_code'))
    ->get();

数据库模式#2:

languages (id, code, name)
models (id)
i18n_models (id, model_id, language_id, name, description)

样本数据#2:

-- 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')

Pros:

  • 更好的数据组织
  • 添加新语言轻而易举
  • 与第一种方法一样,我们也可以使用set() http://fuelphp.com/dev-docs/packages/orm/crud.html填充 $_custom_data 数组的方法:

 

$i18n = Model_I18n_Model::query()
    ->where('model_id', $model->id)
    ->where('language_id', Session::get('lang_code'))
    ->get_one();

$model->set(array(
    'name' => $i18n->name,
    'description' => $i18n->description
));

Cons:

  • 复杂性增加
  • 必须使用 JOIN 或第二个查询
  • 每个型号都需要一个额外的表

数据库模式#3:

在其他问题上,我看到人们建议对所有翻译使用中央 i18n 表,为模型的每个翻译使用一行。

Pros:

  • i18n 在模型之间共享的单个表
  • 添加新语言应该像以前的方法一样容易

Cons:

  • 获取数据时复杂性会增加,需要为模型的每个翻译文本进行 JOIN
  • 我们可以尝试使用EAV集装箱 http://fuelphp.com/dev-docs/packages/orm/eav.html使用这种方法,虽然使用键/值进行映射,但在这种情况下,我们还必须使用 language_id 来获取正确的翻译。

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


我所做的只是添加一个lang表中的字段。

然后我过滤该字段:

SELECT * FROM articles WHERE lang = 'en'

我什至在管理部分的 CRUD 中使用它,用户可以在其中切换语言,并且他们可以看到该特定语言的所有条目。

编辑将自动以他所使用的语言编辑内容。

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

只需从当前本地用户获取“en”即可。 (我确实允许他们改变形式,但要覆盖它)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适用于 i18n 的 FuelPHP ORM 数据库架构,意见/建议 的相关文章

  • Java Swing - 在运行时动态切换语言环境

    我了解如何国际化 java 程序 但我有一个问题 我的程序中的语言可以随时切换 但我的程序可以存在多种状态 这意味着它可能会也可能不会打开多个 JLabels JPanel JFrame 等 是否有一个类或方法可以将当前的 GUI 更新为切
  • 如何使用过程填充数据库

    我有大约 15 个不同的表 其中填充了不同的数据和不同的实体关系 我需要创建一个脚本 用这些表的内容填充我的数据库 脚本完成后 我使用 sqlplus 在 cmd 中运行它 然后使用 START文件路径 我有两个不同的 sql 文件 一个名
  • 为什么 gettext 没有数据库存储选项?

    我正在使用 Django 在基于 Web 的应用程序上进行一些 i18n 操作 该应用程序使用 gettext 作为其 i18n 基础 翻译应该存储在数据库中似乎是一个显而易见的想法 而且并不难做到 但文件系统上的 po 文件仍在使用 为什
  • .NET、C#、LINQ、SQL 和 OR 映射 - 我只是不明白:(

    我只是不明白 我什至不确定我是否在寻找正确的方向 问题 这就是我的 C 应用程序 我通过 SSH 连接到在线 MySQL 数据库 现在我可以使用 MySQL Connector Net 驱动程序 http dev mysql com dow
  • ruby-on-rails 检查查询结果是否为空(Model.find)

    我正在 Rails 上使用 ruby 并尝试检查查询是否返回值 这是查询 search Customer find by name login name 如果查询找到结果 一切都很好 但是我如何对空结果做出反应 I tried if sea
  • 似乎找不到循环 PL/SQL 数组的方法?

    我正在尝试这样做 arrCauses APEX UTIL STRING TO TABLE P1 CAUSE FOR c IN 1 arrCauses count LOOP INSERT INTO DT EVENT CAUSE EVENT I
  • 在iOS中启动应用程序时如何复制sqlite数据库?

    每次启动应用程序时 我想将带有最新更新的 sqlite 数据库从数据库位置复制到我的 iOS 应用程序 有什么办法可以做到吗 您可以将以下方法添加到您的应用程序委托中 void copyDatabaseIfNeeded Using NSFi
  • Phonegap:WebSql 还是 SqLite?

    我使用phonegap的时间很短 并且我对其中的存储概念遇到了一些麻烦 因此 文档指出您可以打开这个数据库 它是一个 SQLite 实现 window openDatabase 返回一个新的数据库对象 此方法将创建一个新的 SQL Lite
  • 使用mysqldump只转储数据,不转储任何表信息

    我正在寻找转储 mysql 数据库中所有数据的语法 我不需要任何表格信息 mysqldump no create info 您也可以使用 skip triggers 如果您使用触发器 no create db 如果您正在使用 databas
  • 如何将数据从 SQLITE 数据库获取到 Android 中的数组?

    很确定这是一个简单的问题 但我对所有将从游标返回的数据适应不同视图的示例感到困惑 我只想运行原始查询并将返回的每一项数据放入浮点数组中 以便我稍后可以将它们添加起来 我需要为此使用什么 Thanks 当您查询数据库时 您仍然会有一个游标 但
  • 通过php将MYSQL数据导出到Excel/CSV

    我想通过 php 将 MYSQL 数据导出到 Excel CSV 这样我以后就可以使用我的数据库 或者有人可以使用并理解它 要使用适合 EXCEL 的语法创建 CSV 文件 您可以使用基本 SQL SELECT FROM mytable I
  • C# - 如何检测 SQLite DB 是否被锁定?

    我正在开发一个使用 SQLite 的多线程 C 程序 我遇到一个问题 有时运行 SQLiteCommand ExecuteNonQuery 来更新某些行会抱怨 SQLite 错误 5 数据库已锁定 我知道发生这种情况是因为数据库在插入或更新
  • 输入数据库时​​拆分文本框中的文本

    当插入 MS Access 数据库 时 如何将文本框中的单词拆分或放入另一行 例如 我的文本框有这些词 ABC DEF 生长激素指数 JKL 当用户按下回车按钮时 以下单词将被插入到文本框中 但每个单词都会在一个新行中 例如 ABC 将位于
  • Chrome 扩展 - 使用 javascript 定期运行并永久记录数据

    目前 我有一个脚本 当单击右上角托盘中的图像 仅适用于一个特定允许的网站 时 它会扫描 HTML 页面 然后输出一些值 此扫描和输出是单个 JS 文件中的函数 称为 checkData js 即使用户没有主动使用选项卡但它已打开 是否有可能
  • formatTime 以“h”而不是“:”作为分隔符

    葡萄牙时间使用以下 24 小时格式 18h30 我试过了 timeFormat H h mm timeFormat H h mm timeFormat H h mm 是否可以 谢谢 您需要使用单引号inside用于插入字母的 JavaScr
  • 始终保持数据库连接打开可以吗?

    我在业余时间从事单用户桌面数据库应用程序之类的工作 并且我总是不确定我所做的设计选择 现在 就目前情况而言 每当用户想要与数据库 这是一个本地 SQLite 数据库 因此通常只有一个用户一次看到它 交互时 应用程序就会创建一个新连接 执行它
  • Doctrine ORM 按注释对象字段排序

    所以它很简单 我在某个实体中有以下代码 var ServiceOffer ORM OneToMany targetEntity ServiceOffer mappedBy serviceProvider ORM OrderBy servic
  • 将计算列设置为非空时遇到问题

    我在将计算列设置为时遇到问题not null 我想要实现的是C001 C002 等 同时将其设置为not null 我在论坛上读到 这可以通过使用 NULL 值的默认值 0 来实现 E g ISNULL Price Taxes 0 我尝试应
  • MySQL:主键的所有部分都必须为 NOT NULL;如果您需要在键中使用 NULL,请使用 UNIQUE 代替

    我的 MySQL 有问题 我创建了名为 BucketList 的数据库 然后尝试创建名为 tbl user 的表 它看起来像这样 CREATE TABLE BucketList tbl user user id BIGINT NULL AU
  • 私人消息数据库设计

    我正在创建一个简单的私人消息系统 但我不确定哪种数据库设计更好 第一个设计是一个消息表 以及一个消息评论表 Message id recipientId senderId title body created at MessageComme

随机推荐

  • React Hooks:如何在 useEffect 中设置 State?

    我正在尝试从 firebase 获取数据并使用 useState 挂钩将检索到的数据设置为我的状态 我知道我的 API 调用正在工作 因为我可以从 firebase 记录数据 但当我使用 setState 时 它并没有达到我的状态 由于某种
  • 为什么 R 有时会停止显示输出?

    有时 R 会停止显示输出 我输入数字 1 然后按回车键 但什么也没有出现 这种情况是在我按下窗口中的 停止 图标后发生的 该图标用于停止长时间的计算 我在 Mac 上使用 R 2 11 0 按 STOP 是否会导致 R 停止显示输出 如何让
  • 使用 C# 比较嵌套对象属性

    我有一个方法可以比较两个对象并返回所有不同属性名称的列表 public static IList
  • 在 Java 中使用嵌套枚举类型

    我心中有一个涉及嵌套枚举的数据结构 这样我就可以执行如下操作 Drink COFFEE getGroupName Drink COFFEE COLUMBIAN getLabel 如果有方法声明 someMethod Drink type s
  • 从js数组中删除双引号

    我有这种类型的数组 80 529299450867271 7 3884550841172976 80 528953669541707 7 3875715810979612 80 528714422417153 7 3867339810469
  • 使用rvest,如何从submit_form()返回的对象中提取html内容

    我正在尝试从 pems dot ca gov 下载一些流量数据 如下这个话题 https stackoverflow com questions 28418770 using rvest or httr to log in to non s
  • Api 网关:用于 Lambda 集成的 AWS 子域

    我正在尝试将我的 lambda 函数与 API 网关集成 该函数必须异步运行 因为它需要太长时间 我相信我必须选择 AWS 服务 并指定 Lambda 而不是选择 Lambda 集成类型 例如 this http docs aws amaz
  • callgrind:如何检查一行是否执行

    是否可以使用 callgrind 产生像 gcov lcov 给出的输出一样的输出 我正在阅读他们的文档 无法找到 callgrind annotate 的确切选项 这是不可能的 但 callgrind annotate 或 kcacheg
  • Web API 项目在部署时不会运行 - 无法加载文件或程序集“Newtonsoft.Json,版本=4.5.0.0”

    当我部署 MVC 5 WEB API 项目时 我不断收到此错误 无法加载文件或程序集 Newtonsoft Json 版本 4 5 0 0 Culture neutral PublicKeyToken 30ad4fe6b2a6aeed 或其
  • Jquery 并将事件绑定到 iframe

    我目前正在使用 jquery textselect 插件根据页面上任何位置的选择文本来触发警报 并且它可以很好地执行以下操作 document ready function document bind textselect function
  • cron 作业替代品?

    我正在安装 Boonex 的 Dolphin 7 它要求我设置一个每 1 分钟运行一次的 cron 作业 然而 我的托管提供商允许我至少每 30 分钟运行一次 crons 我使用过 CMS 它有一个替代品 一个替代 cron 的脚本 有没有
  • Winforms 组件的父级/所有者[重复]

    这个问题在这里已经有答案了 从嵌入表单中的自定义 Winforms 组件中 如何获取父 所有者控件 我有一个 IContainer 并且 Site 属性不为空 但我不知道如何到达 真正的 父级 这是后续这个问题 https stackove
  • MongoDb:如果不存在,则将元素添加到数组[重复]

    这个问题在这里已经有答案了 我正在使用 node js 和 Mongodb 我是新使用 Mongod 的 我有一个这样的文档 Tag name string videoIDs array 这个想法是 服务器接收一个像这样的 JSON JSO
  • FOR /F 命令循环中的错误级别返回意外结果

    我正在尝试记录输出net stop同时还捕捉其ERRORLEVEL 基于这个问题 https stackoverflow com questions 3088712 我在嵌套子例程中尝试了以下操作 set a loopIndex 0 for
  • 如何在基于 php 的系统中的同一页面上显示登录错误消息?

    我正在构建一个基于 php 的登录系统 用户需要输入用户名和密码才能登录 我的问题是 如何在同一页面上显示 无效的用户名或密码 错误消息 我尝试了很多事情 包括尝试使用查询字符串 error 1 它确实通过在同一页面上显示错误消息来解决我的
  • 如何在python中读取Mat v7.3文件?

    我正在尝试阅读以下网站中给出的mat文件 ufldl stanford edu housenumbers 在文件train tar gz中 有一个名为digitStruct mat的mat文件 当我使用 scipy io 读取 mat 文件
  • 在 NetBeans 中禁用“保存快照”

    如何在 NetBeans 7 1 2 中禁用保存快照 它大大减慢了系统速度 有什么建议 这些快照是 IDE 检测到缓慢行为时拍摄的性能快照 由于显而易见的原因 速度较慢的计算机更有可能触发收集 通过花费比预设时间更长的时间来完成任务 然后需
  • 使用 Python 备份 Postgresql 数据库

    我想使用Python代码备份数据库 我想备份一些相关数据的表 如何备份以及如何使用 SELECT 语句选择所需的表 e g 我想获取一些表从 2014 05 01 到 2014 05 10 的数据 并将结果输出为 sql 扩展文件 如何使用
  • 从标头自动生成 C 代码

    我想生成头文件中定义的过程的空实现 理想情况下 它们应该为指针返回 NULL 为整数返回 0 等 并且在理想的情况下 还可以打印到 stderr 调用了哪个函数 这样做的动机是需要实现一个包装器 将复杂的现有 API 头文件 的子集适配到另
  • 适用于 i18n 的 FuelPHP ORM 数据库架构,意见/建议

    虽然这个问题可能是similar https stackoverflow com questions 929410 what are best practices for multi language database design to