使用ID而不是DATE列的任何缺点?

时间:2017-03-25 20:31:52

标签: java sql database postgresql hibernate

我将存储档案用户' ArchivalPassword表中的密码:

CREATE TABLE public.ArchivalPassword (
  id SERIAL,
  userid INTEGER NOT NULL,
  content VARCHAR(100) NOT NULL,
  CONSTRAINT archivalpassword_pkey PRIMARY KEY(id),
  CONSTRAINT archivalpassword_user FOREIGN KEY (userid)
    REFERENCES public.user(id)
    ON DELETE CASCADE
    ON UPDATE CASCADE
    NOT DEFERRABLE
) 
WITH (oids = false);

CREATE INDEX fki_archivalpassword_user ON public.archivalpassword
  USING btree (userid);

对于每个用户,我存储有限数量的密码(基于archived.passwords.limit属性)。如果用户更改密码,我将从ArchivalPassword表中获取存档的密码编号,如果它大于限制,我计算必须删除的密码并删除它们。

要求是我删除最旧的密码。问题是我是否可以假设ID较低的密码比ID较大的密码旧?或者我是否需要添加EXPIREDAT列(日期),该列将用于确定需要删除哪个密码(EXPIREDAT列中具有最早日期的密码)?

以下是假设的EXPIREDAT列定义:

expiredat TIMESTAMP(0) WITH TIME ZONE DEFAULT '2017-03-20 00:00:00+01' NOT NULL;

ID序列定义:

CREATE SEQUENCE public.archivalpassword_id_seq
  INCREMENT 1 MINVALUE 1
  MAXVALUE 9223372036854775807 START 1
  CACHE 1;

您能否看到在描述的情况下使用ID列的任何缺点?

2 个答案:

答案 0 :(得分:0)

假设你的id列类似于BIGSERIAL,那么它有一个序列定义,它自动分配下一个id。在正常情况下,可以根据用户更改密码的顺序可靠地分配ID。但是,可以手动更改序列定义,使其以不同的数字开头,如果有人这样做,则id号将不再代表时间顺序。

我个人会选择使用EXPIREDAT专栏,因为这一直是准确的,意图很明确。不知道你为什么说"但是我必须对日期进行排序而不是整数排序" - 假设你让Postgres进行排序,我不确定为什么你认为有太大差异?

答案 1 :(得分:0)

如果您有许多用户,则整数(Postgres中的串行数据类型)比访问记录的日期和时间(Postgres中的时间戳数据类型)列更快。如果密码在同一天多次更改,则不确定日期列是否合适。