У меня есть две таблицы sql имеющие разное назначение, но при этом есть некоторые общие поля. Стоит ли эти колонки выносить в отдельную таблицу

1 таблица отвечает за отношения двух пользователей, а вторая за посещение одни второго

create table relations(
relation_id int primary key not null,
account_id int not null,
profile_id int not null,
unique(account_id,profile_id),
subscribe tinyint not null,
importance tinyint,
recommendation tinyint,
foreign key (account_id) references accounts(account_id)
on delete cascade,
foreign key (profile_id) references profiles(profile_id)
on delete cascade
)

create table if not exists visits(
visit_id int primary key auto_increment not null,
account_id int not null,
profile_id int not null,
date datetime default now() not null,
status tinyint unsigned not null default 1,
foreign key (account_id) references accounts (account_id)
on delete cascade,
foreign key (profile_id) references profiles (profile_id)
on delete cascade
)

Как видно из кода таблиц поля account_id и profile_id повторяются что на водит на мысль сделать еще одну таблицу pair и ссылаться уже в каждой строке не на пользователей отдельно а на пару. Старый и новый вариант имеет и преимущества и недостатки и я хотел бы узнать мнение более опытных разработчиков на этот счет


Ответы (1 шт):

Автор решения: newman

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

Если у вас "посещения" не могут быть сами по себе, а только в случае уже имеющихся "отношений", то возможным вариантом для оптимизации БД может быть связь между таблицами relations и visits.

Т.е. можно из таблицы visits убрать колонки account_id и profile_id, а добавить колонку relation_id, которая будет ссылаться на таблицу relations. Связь один к многим. Т.е. на одну запись в таблице "отношений" может быть несколько записей в таблице визитов.

→ Ссылка