我想知道这是否可行?将数组插入数据库中的一个字段。
例如我有一个标题,我希望只有一个ID的标题,但它将在网站上使用。
让另一个表格拥有全局ID然后另一个表格与实际标题链接到具有全局ID的表格感觉有点不必要。
我只想拥有这样的东西
ID TITLE
1 Array("english title", "nederlandse titel");
我正在使用PHP / MSYQL,所以如果可行,请用这些语言解释。
哦,是的,我想我可以将它格式化,并使用split函数将其再次转换为数组。但我想知道我是否可以立即将其存储为数组,我认为用户可能会输入相同格式的内容(百万分之一)
答案 0 :(得分:15)
可行:
$title = serialize($array);
然后解码:
$title = unserialize($mysql_data);
但正如所提到的,它首先真正减少了数据库的好处。我肯定建议使用多表或多列选项,具体取决于您希望支持的语言数量,以及该数字将来是否会发生变化。
编辑 dcousineau提到的一个好点(见评论)
有时候,序列化的输出,即使在转义之后,也会将字符抛入查询中。您可能希望将serialize()包装在base64_encode()调用中,然后在反序列化之前使用base64_decode()。
针对这些情况调整了代码:
$title = base64_encode(serialize($array) );
$title = unserialize(base64_decode($mysql_data) );
答案 1 :(得分:6)
这里真的只有两个合理的选择:
加入另一张表
专业人士:无限制语言无限制的作品
缺点:连接开销在计算上更加昂贵,SQL更新/插入等等稍微复杂一些
多列
例如:TITLE_EN,TITLE_NL,TITLE_DE
专业人士:快速插入,选择等
缺点:语言数量有限,添加更多是ALTER TABLE
鉴于我们的两个选择,你通常应该选择第一个。除非您只处理无法并行化的大量交易,否则您绝对可以确保您永远不会添加语言,从长远来看,架构布局的额外灵活性将为您节省麻烦。
答案 2 :(得分:2)
阵列确实违反了规范化;根据我对国际化数据库的经验,我发现有一个标准化的短语是最好的设计,
我允许您轻松制作行的批量副本 - 例如'es'到'es-mx'或'en'到'en-US','en-GB'和我最喜欢的:'xx-piglatin ”。在数组模式中,您要么必须重写每条记录,要么添加复杂的解析或使用比数组更复杂的东西,比如XML。
使用LEFT JOIN
来查找工作中的未翻译短语并使用COALESCE
返回默认值相对容易,因此即使短语未翻译,程序仍然可用。
答案 3 :(得分:1)
使用包含3列的表格!
ID,TITLE_EN,TITLE_NL
没有充分理由将其序列化,真的!