在一行中将数​​组插入数据库

时间:2008-10-09 01:32:32

标签: php mysql database arrays internationalization

我想知道这是否可行?将数组插入数据库中的一个字段。

例如我有一个标题,我希望只有一个ID的标题,但它将在网站上使用。

让另一个表格拥有全局ID然后另一个表格与实际标题链接到具有全局ID的表格感觉有点不必要。

我只想拥有这样的东西

ID      TITLE
1       Array("english title", "nederlandse titel");

我正在使用PHP / MSYQL,所以如果可行,请用这些语言解释。

哦,是的,我想我可以将它格式化,并使用split函数将其再次转换为数组。但我想知道我是否可以立即将其存储为数组,我认为用户可能会输入相同格式的内容(百万分之一)

4 个答案:

答案 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

没有充分理由将其序列化,真的!