【问题标题】:Remember me table indexes记住我的表索引
【发布时间】:2019-02-23 21:25:57
【问题描述】:

我正在 MariaDB 中创建一个表来存储“记住我”-cookie 值:

CREATE TABLE u_remember_me (
    u_user_common_id INT UNSIGNED NOT NULL,
    lookup_key       VARCHAR(30) NOT NULL,
    token_hash       VARCHAR(30) NOT NULL,
    created          DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,

    INDEX (u_user_common_id),
    FOREIGN KEY (u_user_common_id) REFERENCES u_user_common (id) ON DELETE CASCADE ON UPDATE CASCADE,
    PRIMARY KEY (lookup_key),
    UNIQUE KEY (lookup_key, token_hash)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci ENGINE InnoDB;

我总是会通过 lookup_key 字段进行查找,因此选择它作为主键(随机字符串)。 u_user_common_id 列不能设置为主键,因为用户可以分配多个(lookup_key,token_hash),因为有多个浏览器或计算机。对于主键(性能、插入等?),lookup_key 是不是一个糟糕的选择。另外..我应该将主键设置为 (lookup_key, token_hash) 并删除 UNIQUE 约束吗?我选择不使用代理键的原因是因为它永远不会被使用,但我也不确定这是否是一个好的决定(无论如何我都需要对 lookup_key 进行索引)。

【问题讨论】:

  • 嘿@TankSneeze,欢迎来到 Stack Overflow。鉴于您的问题的性质,我认为您应该将其发布在dba.stackexchange.com 而不是这里。
  • 您说“我总是要通过lookup_key 查找”,所以这就是您真正需要的索引。如果您不查询其他列,那么您可以简单地使用lookup_key 作为索引中的唯一列,以防止您的索引变得过于臃肿。
  • 非常感谢@MarcelloGrechiLins :) 另外,感谢您提供关于错误发帖地点的提示 :) 抱歉!还要感谢你@RToyo!我可能会放弃 UNIQUE 约束,因为两个用户是否具有相同的 token_hash 并不重要(即使这极不可能)。这样我可以为额外的索引节省不必要的空间使用。

标签: mysql sql database indexing mariadb


【解决方案1】:

我想你还没有弄清楚什么取决于什么。

lookup_key(随机字符串)是否与单个用户关联?如果是这样,PRIMARY KEY(lookup_key) 并摆脱 token_hash。

如果用户可以从不同的浏览器进行连接并且您希望发生不同的事情,那么您没有指定任何不同的数据。

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多