【问题标题】:Database design. And get last modified time with each column in PostgreSQL数据库设计。并获取 PostgreSQL 中每一列的最后修改时间
【发布时间】:2016-11-10 12:59:28
【问题描述】:

我的数据库/表每个端点/范围都有多个表,
例如用户:用户、用户信息、用户角色 ...
我想知道我应该像下面那样分开表格吗?

这是我第一次构建一个不像以前只是做一些一次性工作的小型网站的产品。这可能会在未来的版本中添加更多功能。

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

任何建议,分享经验将非常感激。



现在我只能想象我可能想知道每一列的最后修改时间?

那么如果我想知道每一列的最后修改时间,PostgreSQL中有没有原始的构建方法?或者我必须为每一列添加 email_last_modified_date, username_last_modified_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")
  );

【问题讨论】:

    标签: database postgresql database-design database-schema


    【解决方案1】:

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

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

    我不清楚您对合并示例的操作,这似乎是非规范化的极端情况。

    如果您想跟踪更改,您可以查找事件溯源,这将提供一种保留完整更改历史记录的方法。有关介绍,请参阅http://martinfowler.com/eaaDev/EventSourcing.html。除此之外,您可以保留您关注跟踪更改的特定实体的历史记录。 .

    【讨论】:

    • 感谢您的回复!什么是事件溯源?你的意思是msdn.microsoft.com/en-us/library/dn589792.aspx
    • @user1775888:是的,同样的事情。
    • 我使用 PostgreSQL 和 nodejs,我发现了这个 npmjs.com/package/eventstore ,事件溯源是否意味着它在 postgresql 事件上触发,但我仍然需要将数据存储在数据库中?
    • 如果我现在不需要这个版本,以后添加方便吗(数据库中的很多数据)?如果是这样,我可能只使用上述模式,然后如果使用事件源,则删除表中的列。
    • 事件溯源不是你事后才想到的东西
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2015-03-02
    • 2011-12-09
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多