Database 数据库设计。并获取PostgreSQL中每个列的上次修改时间

Database 数据库设计。并获取PostgreSQL中每个列的上次修改时间,database,postgresql,database-design,database-schema,Database,Postgresql,Database Design,Database Schema,我的数据库/表每个端点/作用域都有多个表, e、 g用户:用户,用户信息,用户角色… 我想知道我是否应该像下面这样分开桌子 这是我第一次建立一个不象以前那样的产品,只是做一些以前工作过的小网站。这可能会在将来的版本中添加更多功能 我不确定这是不是设计过度了?这样的单独表格将来会有什么好处吗?? 我所知道的缺点是使用更多的表连接,并且我更难维护构建查询 任何建议,分享经验将不胜感激 现在我只能想象我可能想知道每一列上次修改的时间 所以,如果我想知道每一列上次修改的时间,PostgreSQL中是否

我的数据库/表每个端点/作用域都有多个表,
e、 g用户:用户,用户信息,用户角色…
我想知道我是否应该像下面这样分开桌子

这是我第一次建立一个不象以前那样的产品,只是做一些以前工作过的小网站。这可能会在将来的版本中添加更多功能

我不确定这是不是设计过度了?这样的单独表格将来会有什么好处吗??
我所知道的缺点是使用更多的表连接,并且我更难维护构建查询

任何建议,分享经验将不胜感激



现在我只能想象我可能想知道每一列上次修改的时间

所以,如果我想知道每一列上次修改的时间,PostgreSQL中是否有任何原始的构建方法?或者我必须为每个列添加,如
email\u last\u modified\u date
username\u last\u modified\u date



端点/作用域用户

CREATE TABLE IF NOT EXISTS "user"(
    "id" SERIAL NOT NULL,
    "create_date" timestamp without time zone NOT NULL,
    "last_modified_date" timestamp without time zone,
    "last_modified_by_user_id" integer,
    "status" integer NOT NULL,
    PRIMARY KEY ("id")
  );

CREATE TABLE IF NOT EXISTS "user_information"(
    "id" SERIAL NOT NULL,
    "create_date" timestamp without time zone NOT NULL,
    "last_modified_date" timestamp without time zone,
    "last_modified_by_user_id" integer,
    "user_id" integer NOT NULL,
    "email" varchar(100) NOT NULL,
    "username" varchar(50),
    "password" varchar NOT NULL,
    "first_name" varchar(50),
    "last_name" varchar(50),
    "website" varchar,
    "description" varchar,
    "birth_date" timestamp without time zone,
    "country" varchar(50),
    "gender" integer,
    "file_type" integer,
    "file_name" varchar(50),
    "file_extension" varchar(50),
    "file_portrait" boolean,
    PRIMARY KEY ("id"),
    FOREIGN KEY ("user_id") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE
  );
CREATE TABLE IF NOT EXISTS "user_role"(
    "id" SERIAL NOT NULL,
    "create_date" timestamp without time zone NOT NULL,
    "last_modified_date" timestamp without time zone,
    "last_modified_by_user_id" integer,
    "user_id" integer NOT NULL,
    "role" integer NOT NULL,
    PRIMARY KEY ("id"),
    FOREIGN KEY ("user_id") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE
  );
合并表

CREATE TABLE IF NOT EXISTS "user"(
    "id" SERIAL NOT NULL,
    "create_date" timestamp without time zone NOT NULL,
    "last_modified_date" timestamp without time zone,
    "last_modified_by_user_id" integer,
    "status" integer NOT NULL,

    "information_last_modified_date" timestamp without time zone,
    "information_last_modified_by_user_id" integer,
     .... user_information 

    "role_last_modified_date" timestamp without time zone,
    "role_last_modified_by_user_id" integer,
    ... user_role
    PRIMARY KEY ("id")
  );

为每个实体(其中一个实体对业务非常重要,需要唯一标识)和每个多对多关系制作一个表。所以user、role、userrole都得到一个表。在用户和用户信息之间进行分离没有任何价值,您只会引入另一个连接

如果您认为需要一种在不加载用户信息的情况下处理从用户到角色的联接的最佳方式:如果在表上放置索引,许多查询可能只能使用索引,除非需要某些特定数据,否则不必读取表。无需制作单独的用户信息表

我不清楚您对合并示例所做的操作,它似乎是一个非规范化的极端情况

如果您想跟踪更改,可以查找事件源,这将提供一种保存更改完整历史记录的方法。请参阅以获取介绍。除此之外,您可以为您关注的跟踪更改的特定实体保留历史记录。
.

谢谢您的回复!什么是活动来源?你是说这个吗?@user1775888:是的,同样的事情。我在nodejs中使用PostgreSQL,我发现了这个,事件源是否意味着它会在PostgreSQL事件中触发,但我仍然需要在数据库中存储数据?如果现在我在这个版本中没有需要,将来是否可以轻松添加(数据库中有很多数据)?如果是这样的话,我可能只使用上面的模式,接下来如果使用事件源,则删除表中的列。事件源并不是您事后才想到的事情