Цитата(OlegatoR @ 10.11.2016, 21:31)
4я нормальная форма, если не ошибаюсь.
по мне больше смахивает на нфбк, но я в теории не силен. на практике, будь передо мной такая задача, спроектировал бы нечто подобное:
Код
create table chat_flags(
flag bigint,
description character varying (256),
constraint chat_flags_pk primary key (flag)
);
create table chats(
chat_id bigint,
title character varying (256),
avatar character varying (256),
flags bigint,
constraint chats_pk primary key (chat_id)
);
create table users(
user_id bigint,
nickname character varying (256),
avatar character varying (256),
constraint users_pk primary key (user_id)
);
create table messages(
message_id bigint,
user_id bigint,
message text,
creation_time timestamp without time zone,
constraint messages_pk primary key (message_id),
constraint messages_fk foreign key (user_id)
references users (user_id)
);
create table chat_user_messages(
chat_id bigint,
user_id bigint,
message_id bigint,
constraint chat_user_messages_pk (chat_id, user_id, message_id),
constraint chat_user_messages_fk1 foreign key (chat_id)
references chats (chat_id)
constraint chat_user_messages_fk2 foreign key (user_id)
references users (user_id),
constraint chat_user_messages_fk3 foreign key (message_id)
references chats (message_id)
);
здесь таблица chat_flags описывает дополнительные флаги чата 0 - обычная беседа 2-х пользователей, 1 - беседа 2-х и более пользователей с отдельным названием и аватаром чата.
в таблице chats перечислены все существующие беседы, беседы помеченные флагом 1 имеют свой собственный аватар и название.
в таблице users перечислены все зарегистрированные пользователи с никами и аватарами.
в таблице messages находятся все сообщения пользователей.
таблица chat_user_messages объединяет беседы, пользователей и сообщения в составные ключи, по которым можно получить любую информацию о пользователе беседе или сообщении