8

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

例如,我有一个标题,我希望该标题只有一个 id,但它将在网站上以双语形式使用。

感觉有点没必要让另一个表有它们的全局 ID,然后另一个表的实际标题链接到具有全局 ID 的表。

我只想拥有这样的东西

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

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

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

4

5 回答 5

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) );
于 2008-10-09T01:43:59.567 回答
6

这里实际上只有两个合理的选择:

加入另一个表
优点:无限语言的无限标题
缺点:连接开销在计算上更昂贵,SQL 更新/插入等稍微复杂一些

多列
,例如:TITLE_EN、TITLE_NL、TITLE_DE
优点:插入、选择等速度快
缺点:语言数量有限,添加更多是 ALTER TABLE

鉴于我们有两个选择,您通常应该选择第一个。除非您只处理大量无法并行化的事务,或者您绝对可以确保永远不会添加语言,否则模式布局的额外灵活性从长远来看将为您省去麻烦。

于 2008-10-09T01:39:34.147 回答
2

数组确实违反了规范化;根据我对国际化数据库的经验,我发现将短语标准化是最好的设计,

我允许您轻松地批量复制行 - 例如“es”到“es-mx”或“en”到“en-US”、“en-GB”和我最喜欢的:“xx-piglatin”。在数组模式中,您要么必须重写每条记录,要么添加复杂的解析,或者使用比数组更复杂的东西,比如 XML。

LEFT JOIN使用s 来查找工作中未翻译的短语相对容易,也可COALESCE用于返回默认值,因此即使短语未翻译,程序仍然可用。

于 2008-10-09T01:50:43.373 回答
1

使用有 3 列的表格!

ID、TITLE_EN、TITLE_NL

没有充分的理由对其进行序列化,真的!

于 2008-10-09T19:01:11.187 回答
0

有 JSON 数据类型,它也将存储“数组”。

https://dev.mysql.com/doc/refman/8.0/en/json.html

于 2021-09-01T21:22:32.620 回答