2016-07-08 1 views
1

Моей база данных/таблицы каждой конечной точки/сфера имеет несколько таблицы,
например пользователь: пользователь, user_information, USER_ROLE ...
мне было интересно, я должен разделить таблицу, как показано ниже, или не?Дизайн базы данных. И получить время последнего изменения с каждым столбцом в PostgreSQL

Это мой первый раз, когда вы строите продукт не так, как прежде, просто сделайте небольшой рабочий сайт небольшой работы. и это может добавить больше возможностей в будущую версию.

Я не уверен, что это переоценка? Разделяет ли таблица такую ​​выгоду в будущем?
и недостатки, о которых я знаю, - это использование большего количества соединений в таблице, и мне труднее поддерживать построение запроса.

любое предложение, обмен опытом будет по-настоящему оценено.



На данный момент я только могу себе представить, что, возможно, захочу узнать каждое последнее измененное время колонки?

Так что, если я хочу знать каждое последнее измененное время столбца, есть ли какой-либо исходный метод сборки в PostgreSQL? или я должен добавить для каждого столбца, как email_last_modified_date, username_last_modified_date ...



конечная точка/Scope пользователя

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") 
); 

ответ

1

Составьте таблицу для каждого объекта (если компания является то, что важное значение для бизнеса, который должен быть идентифицирован уникальным) и многие-ко-многим. Таким образом, пользователь, роль, каждый пользователь получает таблицу. Нет никакой ценности, которая делает разделение между пользовательской и пользовательской информацией, вы вводите другое соединение.

Если вы думаете, что хотите оптимальный способ обработки объединений от пользователя к роли без загрузки пользовательской информации: если вы поместите индексы в свои таблицы, многие запросы могут использовать только индекс и не будут читать таблицу, если не требуется каких-либо конкретных данных. Нет необходимости составлять отдельную таблицу пользовательских данных.

То, что вы делаете с объединенным примером, мне не ясно, это похоже на крайний случай денормализации.

Если вы хотите отслеживать изменения, вы можете найти event-sourcing, который предоставит вам возможность сохранить полную историю изменений. См. http://martinfowler.com/eaaDev/EventSourcing.html для введения. Кроме того, вы можете сохранить историю для определенных объектов, о которых вы беспокоитесь о отслеживании изменений. .

+0

Спасибо за ответ! что такое event-sourcing? вы имеете в виду это https://msdn.microsoft.com/en-us/library/dn589792.aspx? – user1775888

+0

@ пользователь1775888: да такой же предмет. –

+0

Я использую PostgreSQL с nodejs, и я нашел этот https://www.npmjs.com/package/eventstore, что означает, что событие sourcing означает, что оно запускается при событии postgresql, но мне все еще нужно хранить данные в базе данных? – user1775888

Смежные вопросы