2015-05-04 4 views
0

Ситуация:Таблица SQL Server Первичные и внешние ключи в противоположных таблицах?

У меня есть 2 таблицы:

Таблица 1

TrackID PK 
random columns 
ActionID FK 

Таблица 2

ActionID PK 
random columns 
TrackID FK 

Вопрос: Есть ли проблема с вышеуказанным набором если да, то (нормализация?) или требуется больше информации ...?

Благодаря

Сьюдж

+0

Да, у вас есть проблема точно. Как вы можете добавить строку в таблицу? Способ создания этих ключей означает, что вы не можете добавить новую строку в любую таблицу, если значение для внешнего ключа уже существует в другой таблице. Это очень плохой дизайн. –

+0

Не должно быть необходимости в том, чтобы обе таблицы имели FK для другого. Вам нужно только показать связь. –

+0

Таблица треков (TrackID) является основной таблицей. Когда «действие» принимается относительно дорожки (строки), таблица действий получает строку, а таблица треков обновляется с помощью ActionID. ActionID в таблице треков не требуется. Однако требуется идентификатор TrackID таблицы действий ... – Suge

ответ

0

Предоставленные модели схемы двух сущностей, которые соединены двумя различными отношениями.

Первое соотношение R1 Track - * ---- 1 - Action моделируются поле ActionId в таблице 1

Второе соотношение R2 Track - 1 ---- * - Action моделируются поле TrackID в таблице 2.

Это может быть допустимой, если схемой ваших требований что у вас есть два разных отношения.

Упрощенный пример этом случае будет включать в себя две сущности Employee и Project с

соотношению

managesEmployee - 1 ---- * - Project

и отношение

worksEmployee - * ---- 1 - Project

, предполагая, что работник работает только для одного проекта.

Вопрос здесь, вы хотите смоделировать одно или два отношения?

Если вы хотите смоделировать одну связь между вашими сущностями, ваша схема несколько неправильна, в противном случае она правильная.

0

Есть ли проблема с вышеуказанным набором?

Нет, в классическом значении слова нет «проблемы». Вы можете придерживаться своего дизайна, и у него не будет проблем. Но, стандартно? это то, что я буду обсуждать в следующем разделе.

что (нормализация?) Или требуется больше информации ...?

Да, как я подразумевал выше, есть информация, которую я могу предоставить, чтобы стандартизировать или «нормализовать» ваш дизайн. К сожалению, ваша цель создания этой базы данных не совсем ясна. Знание этой цели необходимо для того, чтобы достаточно ответить на вопрос.Однако я остановлюсь на двух возможных целях, которые, я полагаю, у вас есть один из них.

Назначение 1: каждый трек может иметь одно действие максимум: В этом случае вам не нужны две таблицы. Вы можете иметь:

TrackID PK 
random columns 
random columns of actions /*(will stay null if no action takes place)*/ 

Цель 2: каждая дорожка может иметь ноль или несколько действий: В этом случае вам необходимо две таблицы в следующем:

Таблица 1:

TrackID PK 
random columns 

Таблица 2:

ActionID PK 
random columns 
CreateDate /*(search for creating a DateTime column with default to current date)*/ 
TrackID FK 

Итак, если вы хотите получить последнюю или текущую арендная плата, вы выбираете топ 1 с заказом от CreateDate desc по отношению к треку.

+0

Основная причина, по которой я держался подальше от одной таблицы, состояла в том, что столбцы «Действие» были нулевыми. Трек может иметь 0 или 1 «Действия». «Действие» должно иметь 1 и только 1 «Трек». – Suge

+0

Нет проблем с наличием столбцов Action null, когда у вас нет действия. Это не плохой дизайн, поэтому вам не нужно оставаться в стороне от него. Если вам нравится, вы можете иметь столбец флага в таблице «Трек», чтобы указать, имеет ли трек или нет действия (у вас все еще будут значения нулей в столбцах действий) – yazanpro