【问题标题】:Sorting by unknown column type in mysql在mysql中按未知列类型排序
【发布时间】:2010-12-21 03:43:22
【问题描述】:

所以我有一个用户表;存储用户名、电子邮件等内容。 然后我有一个 user_settings 表。我将其组织为键/值组合,而不是像 timestamp_logged_in、profile_views 等标准列。例如,列是:

user_settings_ID user_ID 名称值

示例记录是: 82 2 'timestamp_logged_in' '2009-10-10 02:23:53'

这使设置更具渗透性。我不需要存在列来存储新的用户设置类型。我担心这样做(这会将每个值存储为字符串,并且我会将其转换为中间件中的适当类型)会使排序变得困难。因此,例如,如果我想按上次登录的顺序获取用户列表,排序将需要一个 sql 调用,例如:

SELECT user_ID FROM user.settings WHERE status='open' AND name='timestamp_logged_in' ORDER BY name

但是,这会将找到的记录排序为字符串。有没有办法确保排序算法mysql是基于某个值类型实现的(例如强制它把排序列当作字符串、整数、日期时间、时间戳等)?

任何想法都会非常感激。 谢谢。 奥利弗·纳萨尔

【问题讨论】:

    标签: mysql database sorting timestamp normalization


    【解决方案1】:

    您必须手动将cast 设置为正确的数据类型。

    如果您希望表变大,像这样存储为键值对,虽然一开始这似乎是个好主意,但最终总是会以非常糟糕的性能结束,因为您无法创建有用的索引。现在考虑,而不是以后改变。

    【讨论】:

      【解决方案2】:

      为什么不将数据存储在“可排序的”字符串表示中......“预转换为可排序的格式”

      您可以将其存储为 '2009.11.28 11:45' 而不是 '11-28-2009 11:45'

      MySQL 具有在“中间件”中类型转换回“日期时间”或“日期”所需的功能。

      【讨论】:

      • 我不太清楚为什么中间件在引号中。这可以工作,但意味着在“中间件”中付出相当大的努力来非常规地格式化事物。
      • 如果您打算对存储到字符串中的数据进行排序,则必须在某一时刻完成转换。写入时一次,读取时一次(每行/字段)或在排序期间进行比较时每次。我将中间件放在引号中,因为我可能会在客户端或应用服务器中进行转换,而不是在通信代码中。还要考虑 Donnie 对性能的评论(最好在设计时考虑性能/缩放)。如果您在 user.settings 中的行数 >100'000,我强烈建议每个 user.config 条目输入/专用字段
      • 谢谢老兄。我计划将 200k+ 记录放在门口,所以我会听从建议。谢谢先生。
      猜你喜欢
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      相关资源
      最近更新 更多