PHP关于自定义字段+多语言的网站数据库设计

PHP关于自定义字段+多语言的网站数据库设计,第1张

首先说明一点,用序列化和JSON不会不安全啊,数据安不安全取决于你的程序有没有过滤并且处理好要入库的数据,一般来说,入库的数据是需要保证安全的。

对于你这个问题,最好的做法还是字段扩展,这样至少搜索速度上不会出现大问题,如果是将所有的数据都放到一个字段上,就是上面的content字段,这样后续并不利于搜索,数据感觉也比较混乱。如果仅仅是多语言实现,单词之间的对应关系,这样使用单字段还是可以的,毕竟数据也不多。

一般的,如果是普通的项目型软件,就比较简单了,你只需要设计出固定的 ChineseName和EnglishName字段就可以了。本文并不讨论这种形式,而是讨论在大型平台化的ERP软件中如何实现通用化的多语言存储和读取。

子表方式第一种方式是建立一张子表,U9大概就是这个样子,你需要注意的是,每一个实体如果包含多语言字段,都会出现以_Trl为后缀的表。也许你会觉得麻烦,其实不然,这些都是平台在后台自动处理了,你仅仅需要标记这个字段是多语言字段就可以了。

从理论上来说,他的存储是最符合数据库设计原则的,不管你的系统使用多少语言,数据库结构是不变的。但是我总觉得查询起来SQL会比较复杂,虽然这事平台也会帮助你完成。我在想,如果我要一个多语言策略如何实现呢?多语言策略的例子:如果此字段没有对应的繁体中文,取简体中文,如果还没有,取默认的语言内容。那么在一个SQL中如何实现呢?

数据结构是一样的,唯一的区别是通过ORM屏蔽了数据库的结构,在设计实体时,你仅仅设计了Name字段,其类型是“多语言类型”,然后在客户那里初始化时,客户可以决定采用多少种语言,然后ORM在后台自动添加这些列。

这是我希望的设计,因为他足够的简洁,任何人都可以非常方便的写出SQL语言。而且执行起来一定是最高效的。而且实现上面说的取值策略也很容易,只需要实现编排好多个嵌套的IIF函数就是了。

缺点呢?当然有,首先冗余很大,即使没有填写对应的英文,一样要占用一个空间。其次,如果客户发神经,一下子选择了十几个语言,然后发现他并不需要,又想删除掉?那么我需要检查数据库的所有相关字段是否全部没有数据,才能决定可以删除这个语言并删除所有相关的字段。这是个问题。

XML字段

这种方式我就不画图了,很简单,还是只有一个字段Name,不过数据类型不是nvarchar,而是把定义成XML类型,这是SQLServer2005新增的类型,我们可以在此字段存储诸如下面这样的数据:

<items

<item lng="" value="默认" /

<item lng="CHS" value="中文" /

<item lng="EN" value="English" /

</items

Select EmployeeId,Name.value(’(/items/item[@lng="CHS"]/@value)[1]’,’nvarchar(max)’) FROM Employees

很简单,我喜欢。

不过有人可能会说,其实没有xml类型前,我就已经使用nvarchar来实现了,使用一个自定义函数一样可以解决(使用诸如:/en/english /chs/中文的方式存储)。但是我认为字符串方式处理并不完美,主要表现在你必须自己小心处理特殊字符,否则很容易乱套。使用XML类型的话数据库会处理这些。另外,SQL Server对XML类型的查询有优化处理,比起SQL自定义函数运行的速度要快的多。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9892292.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存