Моделирование данных SQL

введите здесь описание изображения

Я пытаюсь создать базу данных (на фото)

Одним из критериев является то, что любой используемый инструмент может использоваться только 1 музыкантом одновременно.

Мне было интересно, как я буду реализовывать такую ​​схему?

Еще одним критерием является то, что 1 из музыкантов каждой песни является продюсером. Как бы я реализовал этот критерий, чтобы продюсер был из списка музыкантов этой песни?

Может быть, это 2 несвязанных вопроса, я не уверен?


person user3075549    schedule 08.12.2013    source источник
comment
Предложение, не связанное с вопросом (поскольку на него дан ответ): не используйте имена таблиц во множественном числе.   -  person NoChance    schedule 10.12.2013


Ответы (2)


Первый вопрос:

Если объединить таблицы songinstruments и songmusicians следующим образом: songinstrumentsmusicians:

SongId
InstrumentId
MusicianId

и добавьте уникальное ограничение для (SongId,IntrumentId)

Второй вопрос:

Добавьте флаг продюсера к songmusicians (или songinstrumentsmusicians).

person Lajos Veres    schedule 09.12.2013

1-й вопрос: в том же духе, что и @lajos-veres:

Создайте таблицу: МузыкантИнструмент

PK|ID

FK|Идентификатор музыканта | инт

FK|ИнструментID | гостиница

Завершить | дата и время

После этого: (ссылка) (предполагается, что SQL Server)

Создайте пользовательскую функцию проверки и проверьте ограничение:

CREATE FUNCTION CheckActiveCount(
 @MusicianId INT, @InstrumentId INT
) RETURNS INT AS BEGIN

  DECLARE @ret INT;
  SELECT @ret = COUNT(*) FROM MusicianInstrumnet 
     WHERE MusicianId = @MusicianId AND InstrumentId = @InstrumentId and (Enddate IS NULL  OR Endate > CURDATE());
  RETURN @ret;

END;
GO

ALTER TABLE MusicianInstrumnet
  ADD CONSTRAINT CheckActiveMusicianInstrument CHECK (NOT (dbo.CheckActiveCount(MusicianId, InstrumentId) > 1));
GO

Придется бежать, постараюсь заняться #2 после экзамена.

person matt.bungard    schedule 09.12.2013