【问题标题】:Is holding serialised data bad practice for a database table? [closed]保存数据库表的序列化数据是不好的做法吗? [关闭]
【发布时间】:2013-04-28 11:16:32
【问题描述】:

在我的 Web 应用程序中,我将用户个人资料信息存储在一个编码的 JSON 数组中,下面是一个示例。

{"youtube":"username","skype":"username","facebook":"username","twitter":"username","googlep":"username","steam":"username","origin":"username"}

这是不好的做法吗?

【问题讨论】:

  • 取决于您打算如何处理这些信息?
  • 视情况而定。一般来说,我会有单独的列,因此您可以强制执行大小限制并在查询中使用值,但有些系统确实将序列化数据块保存在单个列中。我想到了 Wordpress,它似乎在那里运行良好!
  • 当我看到标题时,我以为你问 MySQL 是不是一个坏习惯,我正要说是。)但回到你的问题:我认为它违反了拳头范式。
  • @BurhanKhalid 我只是将它显示在用户的个人资料页面上,我不将它用作任何类型的索引。
  • 您打算对其进行搜索吗?例如,通过用户的 Skype 名称查找用户,或防止注册重复的 Skype 名称?

标签: mysql database json


【解决方案1】:

正如 Burhan Khalid 在他的评论中所说,这取决于你想要实现什么。如果您只是存储该数据以便稍后显示它们,这很好。因此,您不会有将数据转换为 JSON 的开销。顺便说一下,这种技术被称为denormalization

这样一个 JSON 字段的问题是你不能用 SQL 来查询它。所以这些数据以某种方式丢失了。但是,如果您不需要能够搜索该数据,您可以简单地存储它们并在客户端处理数据。

但如果您需要访问数据,您应该normalize 您的数据库。因此,您将能够查询数据,并且必须将结果转换为 JSON 字符串。使用 json_encode() 函数非常简单。

【讨论】:

    【解决方案2】:

    是的,请参阅:Normalizaion 您必须在一个字段中存储一个值。而不是多个。

    你最好选择第二张桌子,例如:

    user_id   |  system   | username
       1      |  youtube  | the name
     .............................
    

    user_id 是用户表的外键。你有一个组合主键(user_idsystem

    更新 在生产中,正常的标准化水平是 3 级。因为实现更高的标准化非常困难。当然,出于多种原因(我在这里看不到您的原因),规范化表/模型或其部分可能是件好事。

    【讨论】:

    • 标准化取决于用例。对于快速读取,首选非规范化。在您的情况下,答案需要上下文,因为我确信您对 OP 的用例做了一些假设。
    • 差不多。关系模型允许任意复杂的值。值甚至可以是表格。关系问题是 dbms 如何处理这些复杂值。 dbms 要么原封不动地返回它们,要么提供对复杂结构进行操作的函数。日期和时间戳表示复杂的值,但 dbms 提供了对它们进行操作并返回例如年份、星期或星期几的函数。
    • 好吧,这很好@MikeSherrill'Catcall'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2016-04-17
    • 2022-01-18
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多