【问题标题】:Simple Database Design Question简单的数据库设计问题
【发布时间】:2009-09-21 07:50:44
【问题描述】:

我正在开发支持 php 和 mysql 的 Web 应用程序。我有一个名为 users 的表,在这个表中我存储了一些信息,例如用户名、名字和姓氏、电话号码等。在我的应用程序中,用户可以输入一些可选信息,例如电子邮件通讯选项、公司名称(如果可以的话.. ) 或网站网址。所有这些信息(应用程序有大约 20 种可选信息类型)都是可选的。在这种情况下,哪种数据库设计才是正确的?

也许我可以将所有额外信息存储在数组中并使用序列化并保存到数据库,然后在读取数据时我应该使用反序列化,但这种方式有一些缺点。我正在等待想法,谢谢。

【问题讨论】:

  • 我认为您应该重写您的问题标题,使其更具体并更准确地反映您正在回答的内容,例如“数据库设计:可以将可选数据存储在序列化数组中吗?”或类似的东西

标签: php mysql database database-design


【解决方案1】:

如果您使用 php 的序列化将额外的数据序列化为一列,您将永远无法查询该数据。 IE 如果你想用“http://www.foo.com”之类的网站查询用户,你不能这样做,因为该数据是序列化的。

我通常不喜欢在我的数据库中存储序列化数据,除非没有办法。

【讨论】:

    【解决方案2】:

    你为什么要这样做?

    没有任何好处:你不能查询它,它对任何其他不知道它的开发人员来说都很模糊?等等

    最好的做法是为每个可选信息设置 1 个字段,并设置为“Nullable”。如果用户不输入任何内容,则该行包含DBNull

    【讨论】:

      【解决方案3】:

      添加一个包含三列的额外表格 OptionalInformation:

      • FK_UserID
      • 可选字段名
      • 价值

      这三者的组合是您的这张表的主键。 这比序列化列更容易查询。

      如果您决定稍后存储更多信息,它也会变得更容易。您不必在用户表中添加额外的列,而是在 OptionalInformation 表中添加一行

      【讨论】:

      • 这是一个性能杀手,我不推荐,除非列会经常更改(我的意思是每天而不是每月)。
      【解决方案4】:

      我看不出没有将您想要捕获的所有数据作为数据库中的字段的任何好处。

      如果您以某种方式对数据进行序列化,您将无法对其进行查询,那么获取这些值总是需要做更多的工作,并且会让其他人更难理解您的设计。

      如果您有单独的列,则很容易找到您想要的数据,如果您有一个带有 Intellisense 之类的编辑器,它将自动完成列名。

      您希望从序列化数据中获得什么好处?大多数数据库在如何存储数据方面都非常聪明,因此您不会节省任何磁盘空间,而且很可能无论如何都不会成为问题。

      【讨论】:

        【解决方案5】:

        我只选择一张表 - 用户,可选字段的默认值为 NULL。

        【讨论】:

          【解决方案6】:

          我敢肯定,在您的架构设计中,有很多方法可以将其作为单个/通用实体来实现。

          序列化、键值查找表等...

          但如果只有 20 列,我会质疑您是否应该这样做。让您的工具和数据库完成工作并将它们保留为列。当您以后想要报告或提取此数据时,以任何其他方式执行此操作可能会让您后悔。

          【讨论】:

            【解决方案7】:

            将这些可选字段添加为多个表字段或单个“可选”字段取决于原因中的应用程序,但我会说,如果您确定这些字段都不会用于SQL查询的任何方式,那么应该没问题。

            有一点需要注意,我不会使用 serialize() 而是:

            $json = json_encode($data);
            

            $data = json_decode($json, true)
            

            与 serialize() 不同,json 可以在其他地方(javascript/浏览器)反序列化,是二进制安全的,而且它也是人类可读的。

            【讨论】:

            • 将某些东西序列化到数据库中确实应该避免,serialize() 或 json_encode() 是一样的。
            • 正如我所说,这将取决于应用程序的原因。此外,正如我所解释的,serialize 和 json_encode 不一样——serialize 使用 PHP 原生的(二进制)数据格式,而 JSON 是用大量语言实现的标准格式。
            【解决方案8】:

            序列化可防止您查询某一特定数据。当然,您可能想知道谁和所有人都选择了时事通讯。然后您应该将每个信息存储在单独的列中。

            您可能很想对可选列使用 NULL 值。但是在性能方面,NULL 值在索引和排序方面给服务器带来了压力。因此建议使用空字符串或零作为列的默认值。在 PHP 中,您可以使用 empty() 方法检查状态。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              相关资源
              最近更新 更多