1 Востаннє редагувалося Олександр Ковальчук (06.07.2023 16:41:00)

Тема: Проектування бази даних

Всім привіт !
Маю завдання:

Створіть базу даних «Музична колекція». База даних повинна містити інформацію по музичних дисках, виконавців, стилях. Необхідно зберігати наступну інформацію:
1. Про музичному диску: назва диска, виконавець, дата випуску, стиль, видавець
2. Про стилях: назви стилів
3. Про виконавців: назва
4. Про видавців: назва, країна
5. Про пісні: назва пісні, назва диска, тривалість пісні, музичний стиль пісні, виконавець.

Реалізував так:

use master
go

if db_id('Music_Library') is not null
begin
    drop database [Music_Library] 
end
go

create database [Music_Library] 
go

use [Music_Library]
go

create table [Styles]
(
    [Id] int primary key identity not null,
    [Name] nvarchar(256) not null check([Name] <> '') unique
);
go

create table [Singers]
(
    [Id] int primary key identity not null,
    [Name] nvarchar(256) not null check([Name] <> '') unique,
    
);
go

create table [Countries]
(
    [Id] int primary key identity not null,
    [Name] nvarchar(256) not null check([Name] <> '') unique
);
go

create table [Publishers]
(
    [Id] int primary key identity not null,
    [Name] nvarchar(256) not null check([Name] <> '') unique,
    [CountrieId] int  not null  references [Countries](Id) 
);
go

create table [Discs]
(
    [Id] int primary key identity not null,
    [Name] nvarchar(max) not null check([Name] <> ''),
    [Date] date not null check(date <= getdate()),
);
go

create table [DiscsPublishers]
(
    [PublisherId] int  not null  references [Publishers](Id),
    [DiscId] int  not null  references [Discs](Id),
    primary key ( [PublisherId],[DiscId])
);
go

create table [Songs]
(
    [Id] int primary key identity not null,
    [Name] nvarchar(max) not null check([Name] <> ''),
    [SingerId] int  not null  references [Singers](Id),
    [StyleId] int  not null  references [Styles](Id)
);
go

create table [DiscsSongs]
(
    [SongId] int  not null  references [Songs](Id),
    [DiscId] int  not null  references [Discs](Id),
    primary key ( [SongId],[DiscId])
);
go

https://replace.org.ua/uploads/images/12314/73dc4855d029078974d5c56fb809ccd0.png

Але є одна проблема.В завданні сказано що на диску має бути один виконавець і один стиль музики.
А в такому варіанті в диск можна додати будь яку пісню.
Як заборонити додавати до диску пісні з іншим виконавцем чи стилем?

2

Re: Проектування бази даних

Найтупіше - перенести SingerId і StyleId з Songs до Discs.

Re: Проектування бази даних

Воно то так....але тоді виходить що стиль пісні буде залежати від діску на якому вона записана....
І пошук пісень певного виконавця буде відбуватися через диск. Якщо видалити диск то видаляться і звязки виконавця і пісні.

4

Re: Проектування бази даних

В мої часи ми ставили Trigger'и на Insert & Update. Але

Олександр Ковальчук написав:

В завданні сказано ..

про спосіб такого обмеженя має бути написано в тому ж завданні.

Подякували: koala, flatliner2

5 Востаннє редагувалося Олександр Ковальчук (06.07.2023 16:52:25)

Re: Проектування бази даних

Так отож...я не впевненний що умова задачі правильна...
В нас таке буває...думай над вирішенням на додаток думай чи правильна умова.

1. Про музичному диску: назва диска, виконавець, дата випуску, стиль, видавець

Я зробив такий висновок з того що сказано саме виконавець - тобто один виконавець.
Те саме й про стиль...

6

Re: Проектування бази даних

Триґери у всі часи були сповільнюючим фактором. Відчутно коли кількість операцій перевалює за N. На тестових кількостях все ок.

7

Re: Проектування бази даних

Олександр Ковальчук написав:

не впевненний що умова задачі правильна..

В таких випадках все досить просто: Всі питання, які виникли після прочитаного завдання, мають бути відправлені тому, хто дав вам це завдання, і він має дати вам відповіді на них.
Якщо це завдання є частиною освітнього процесу навчального закладу, то ви маєте використати корпоративну пошту цього закладу для відправки листа викладачу, який видав вам це завдання.

Ставити питання (про завдання) на якомусь форумі є як мінімум не ефективно. Користувачі форуму [ймовірно] не мають інфо про очікування того, хто видав завдання.

Re: Проектування бази даних

leofun01 написав:

Ставити питання (про завдання) на якомусь форумі є як мінімум не ефективно.

Я згідний..але задаю тут це питання бо думав що може я чогось не розумію...не бачу рішення.

9

Re: Проектування бази даних

frz написав:

Триґери у всі часи були сповільнюючим фактором.

Ну, так. Але це спосіб автоматизації (1 із), досить зручний в деяких випадках.

10

Re: Проектування бази даних

Олександр Ковальчук написав:

не бачу рішення

Якщо користуєте MS SQL Server & (Management Studio | Visual Studio), то там є окрема кнопка для цього
New Trigger ...
Після натисканя відкриється вкладка з шаблоном для триґера. Перед виконаням його треба змінити відповідно до ваших потреб.

Якщо якесь інше середовище, тоді тільки через запит Create Trigger | Alter Trigger.

11

Re: Проектування бази даних

безкоштовна версія ґпт написав:
-- Drop existing tables if needed
if object_id('DiscsSongs') is not null
    drop table [DiscsSongs];
if object_id('Songs') is not null
    drop table [Songs];

-- Create Songs table
create table [Songs]
(
    [Id] int primary key identity not null,
    [Name] nvarchar(max) not null check([Name] <> ''),
    [SingerId] int not null references [Singers](Id),
    [StyleId] int not null references [Styles](Id),
    unique ([SingerId], [StyleId]) -- Ensure unique combination of SingerId and StyleId
);
go

-- Create DiscsSongs table with unique constraints
create table [DiscsSongs]
(
    [SongId] int not null references [Songs](Id),
    [DiscId] int not null references [Discs](Id),
    primary key ([SongId], [DiscId]),
    unique ([DiscId]), -- Ensure unique DiscId
    unique ([DiscId], [SongId]) -- Ensure unique combination of DiscId and SongId
);
go

12 Востаннє редагувалося Олександр Ковальчук (06.07.2023 19:22:53)

Re: Проектування бази даних

frz написав:
безкоштовна версія ґпт написав:
    unique ([SingerId], [StyleId]) -- Ensure unique combination of SingerId and StyleId

Це означає що  не може бути дві пісні одного виконавця з однаковим жанром...

Подякували: leofun011

13 Востаннє редагувалося Олександр Ковальчук (06.07.2023 19:21:24)

Re: Проектування бази даних

frz написав:
безкоштовна версія ґпт написав:
    unique ([DiscId]), -- Ensure unique DiscId

Це не позволить на диск додати більше однієї мелодії....
ГПТ ще той хуліган.... :D

14

Re: Проектування бази даних

Олександр Ковальчук, GPT лише пропонує. Очікується що користувач буде видаляти зайві рядки з коду.

frz, в чому сенс бути посередником між GPT і користувачем, який потребує допомоги ?

15

Re: Проектування бази даних

Може хтось навіть не пробував запитати в робота. А те що воно пропонує що попало - ну для того є уточнюючі запитання.

Re: Проектування бази даних

Я не знаю ... може так працює безкоштовна версія ГПТ але вона дуже часто пише дурниці.
При написанні sql запиту може звязувати таблиці між якими і близько немає звязку.
А потім тільки сипле вибаченнями і далі лабуду пише... :D

Подякували: leofun011

17

Re: Проектування бази даних

Ну я тому перестав платити за преміум, бо побачив що надати зародок ідеї куди самостійно копати далі може і безкоштовна версія ґпт.