我正在开发支持php和mysql的web应用程序。我有表名为users的用户,在此表中我存储了一些信息,如用户名,名字和姓氏,电话号码等。在我的应用程序中,用户可以输入一些可选信息,如电子邮件通讯选项,公司名称(如果有效... )或网站网址。所有这些信息(应用程序有大约20种可选信息类型)是可选的。在这种情况下哪种数据库设计是真的?
可能是我可以将所有额外信息存储在数组中并使用序列化并保存到数据库然后在读取数据时我应该使用unserialize但这种方式有一些缺点。我在等待你的想法,谢谢你。
答案 0 :(得分:6)
如果使用php的序列化将额外数据序列化为一列,您将永远无法查询该数据。 IE如果您想查询具有“http://www.foo.com”等网站的用户,则无法执行此操作,因为该数据已序列化。
我通常不喜欢将序列化数据存储在我的数据库中,除非没有办法解决它。
答案 1 :(得分:2)
你为什么这样做?
没有任何好处:你不能查询它,它对任何其他不了解它的开发者来说都很模糊?等
最好的办法是为每个选项信息设置1个字段,并设置“Nullable”。如果用户没有输入任何内容,则该行包含DBNull
。
答案 2 :(得分:1)
添加一个额外的表OptionalInformation,其中包含三列:
三者的组合是此表的主键。 查询比序列化列更容易查询。
如果您决定稍后存储更多信息,它也会更容易。您不必在用户表中添加额外的列,而是在OptionalInformation表中添加一行
答案 3 :(得分:0)
我看不到将您想要捕获的所有数据都作为数据库中的字段捕获的任何好处。
如果您以某种方式对数据进行序列化,则无法对其进行查询,那么获取值将会更加有效,这将使其他人更难理解您的设计。< / p>
如果您有单独的列,那么很容易找到您想要的数据,如果您有一个类似Intellisense的编辑器,它将自动完成列名称。
您希望从序列化数据中获得哪些好处?大多数数据库对于如何存储数据非常聪明,因此您不会保存任何磁盘空间,并且无论如何这都不会成为问题。
答案 4 :(得分:0)
我只想找一个表 - 用户,可选字段的默认值为NULL。
答案 5 :(得分:0)
将这些可选字段添加为多个表字段或单个“可选”字段取决于应用程序的原因,但我会说,如果您确定,那些字段都不会用于对于SQL查询的任何方式,那都应该没问题。
有一点需要注意,我不会使用serialize()而是:
$json = json_encode($data);
和
$data = json_decode($json, true)
与serialize()不同,json可以在别处(javascript / browser)进行反序列化,是二进制安全的,并且它也是人类可读的。
答案 6 :(得分:0)
我确信在您的架构设计中,有很多方法可以作为单个/通用实体执行此操作。
序列化,键值查找表等等......
但只有20列,我会质疑你是否应该这样做。让您的工具和数据库完成工作并将它们保存为列。如果您希望将来报告或提取此数据,您可能会后悔以任何其他方式执行此操作。
答案 7 :(得分:0)
序列化可防止您查询某个特定数据。绝对你可能想知道谁和所有人都选择了时事通讯。然后,您应该将每个信息存储在单独的列中。
您可能想对可选列使用NULL值。但是性能方面,NULL值在索引和排序方面给服务器带来了压力。因此,建议将空字符串或零作为列的默认值。从PHP中,您可以使用empty()方法检查状态。