Определение первичных и потенциальных ключей




Введение

Целью данного индивидуального задания является разработка базы данных, предназначенной для хранения и обработки данных какой-либо одной небольшой автостостоянки (на 50 мест). В базе данных необходимо хранить и обрабатывать следующую информацию:

1. Сотрудники авто парковки. В базе данных должна храниться контактная, а также любая другая информация о каждом работнике авто стоянки, от сторожа до директора:

· ФИО сотрудника

· Адрес

· Телефон (домашний, мобильный)

· Дата рождения

· Дата приема на работу

· Должность

· Оклад

· Дата увольнения (если сотрудник увольняется, информация о нем из базы данных не удаляется)

2. Парковка. Информация о парковочных местах.

· Номер парковочного места

· Количество парковочных мест

3. Операции. Сюда входит информация о со скольки и до скольки парковочное место было занято.

· Парковочный номер

· Время приезда на парковку

· Время уезда с парковки

· Стоимость парковочного места (и днем и ночью парковочное место стоит одинаково)

Концептуальная модель

Определение сущностей

 

Любой фрагмент предметной области может быть представлен как множество сущностей, между которыми существует некоторое множество связей. Дадим определения:

Сущность (entity) - это объект, который может быть идентифицирован неким способом, отличающим его от других объектов. Примеры: конкретный человек, предприятие, событие и т.д.

Набор сущностей (entity set) - множество сущностей одного типа (обладающих одинаковыми свойствами). Примеры: все люди, предприятия, праздники и т.д. Наборы сущностей не обязательно должны быть непересекающимися. Например, сущность, принадлежащая к набору МУЖЧИНЫ, также принадлежит набору ЛЮДИ.

Сущность, фактически, представляет из себя множество атрибутов, которые описывают свойства всех членов данного набора сущностей.

На первом этапе проектирования БД мы определяем сущности для корректного использования их значений при определении типов связей между ними.

 

1. Парковочное место – сущность, представляющая из себя территорию авто стоянки, которое может быть занятым или свободным. Атрибуты:

· ID (уникальный идентификатор парковочного места)

· Price (цена)

 

2. Сотрудник – сущность, описывающая каждого сотрудника предприятия.

· ID (уникальный идентификатор сотрудника)

· Firstname (имя)

· Lastname (фамилия)

· Address (адрес)

· Phone (домашний телефон)

· Cellphone (мобильный телефон)

· Birthday (дата рождения)

· Hiredate (дата приема на работу)

· Post (занимаемая должность)

· Salary (текущая заработная плана)

· Fired (поле указывающее на то, если сотрудник был уволен)

· Firedate (дата увольнения сотрудника)

 

3. Операция – сущность описывающая учет парковочных мест.

· ID (уникальный идентификатор операции)

· Place_id (ID парковочного места, с которым эта операция связана)

· Time_in (время приезда на парковку)

· Time_out (время уезда на парковку)

· Price (тут указывается цена, за час парковки в данный момент)

Определение типов связей между сущностями

 

На втором этапе проектирования БД мы предварительно строим связи между сущностями, которые в дальнейшем будут использоваться при построении физической модели.

 

Сущность Связь Сущность Тип связи
Сотрудник Дежурит На стоянке М:1
Операции Совершаются над Стоянками 1:1

 

Определение атрибутов

 

На этом этапе проектирования БД мы определяем атрибуты для наших сущностей, которые будут описывать будущую физическую модель.

 

 

Сотрудники Операции Парковочное место
Id Id Id
Firstname Place_id Price
Lastname Time_in ----------------------------------
Address Time_out ----------------------------------
Phone Price ----------------------------------
Cellphone ---------------------------------- ----------------------------------
Hiredate ---------------------------------- ----------------------------------
Birthday ---------------------------------- ----------------------------------
Post ---------------------------------- ----------------------------------
Salary ---------------------------------- ----------------------------------
Fired ---------------------------------- ----------------------------------
Firedate ---------------------------------- ----------------------------------

 

Определение доменов

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

 

Сущность Атрибут Диапазон допустимых значений Тип данных
1. Сотрудники Id Число от 1 до 1 млн. Int
Firstname До 30 символов Varchar(30)
Lastname До 30 символов Varchar(30)
Address До 60 символов Varchar(60)
Phone До 30 символов Varchar(30)
Cellphone До 30 символов Varchar(30)
Hiredate Полный формат даты Datetime
Birthday Полный формат даты Datetime
Post До 20 символов Varchar(20)
Salary Полный денежный формат даны Money
Fired До 5 символов ('TRUE' или 'FALSE') Varchar(5)
Firedate Полный формат даты Datetime
2. Операции Id Число от 1 до 1 млн. Int
Place_id Число от 1 до 1 млн. Int
Time_in Полный формат даты Datetime
Time_out Полный формат даты Datetime
3. Парковочные места Id Число от 1 до 1 млн. Int
Price Число от 1 до 1 млн. Money

 

Определение первичных и потенциальных ключей

 

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

 

Сущность Первичный ключ Потенциальный ключ
Сотрудники Id Cellphone
Phone
Address
Парковочное место Id Id
Операции Id -------------------------------------

 

Диаграмма

 

Диаграмма является предзавершающим этапом в проектировании БД и определяет цепь событий осуществляемых пользователем.

Логическая модель

Логическая модель является завершающим этапом при проектировании БД. Здесь мы определяем структуру связей всех сущностей друг с другом. Удачная разработка логической модели данных обеспечивает простоту построения физической модели.

 

   
 
 
 

 

 


Физическая модель

Схема связей

 

 

Создание таблиц

 

· Employees (Сотрудники) – в данной таблице будет собрана информация о всех сотрудниках парковки, работающих сейчас, или работающих раньше, но уволенных. Помимо имени и фамилии, необходима также контактная информация (адрес и телефон), а также информация о занимаемой должности и заработной плате в магазине.

 

CREATE TABLE [Employees] (

[id] [int] IDENTITY (1, 1) NOT NULL,

[fname] [varchar] (20) COLLATE Cyrillic_General_CI_AS NULL,

[lname] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL,

[address] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL,

[phone] [int] COLLATE Cyrillic_General_CI_AS NULL,

[cellphone] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL,

[hiredate] [datetime] NULL,

[birthday] [datetime] NULL,

[post] [varchar] (20) COLLATE Cyrillic_General_CI_AS NULL,

[salary] [money] NULL,

[fired] [varchar] (5) COLLATE Cyrillic_General_CI_AS NOT NULL CONSTRAINT [DF__Employees__fired__6B24EA82] DEFAULT ('FALSE'),

[firedate] [datetime] NULL CONSTRAINT [DF__Employees__fired__6C190EBB] DEFAULT (null),

PRIMARY KEY CLUSTERED

(

[id]

) ON [PRIMARY]

) ON [PRIMARY]

GO

 

· Parking_Place (парковочное место) – В этой таблице собрана информация о парковочных местах.

 

CREATE TABLE [Products] (

[id] [int] IDENTITY (1, 1) NOT NULL,

[price] [money]NULL

PRIMARY KEY CLUSTERED

(

[id]

) ON [PRIMARY]

) ON [PRIMARY]

GO

 

· Operations (Операции) – В данной таблице сохраняется информация об операция проводимых на парковке. Причем присутствуют данные как и о настоящем состоянии парковки, так и история. Также указывается дата и время операции для построения отчетов о прибыли.

 

CREATE TABLE [Operations] (

[id] [int] IDENTITY (1, 1) NOT NULL,

[place_id] [int] NULL,

[time_in] [datetime] NULL,

[time_out] [datetime] NULL,

[price] [money] NULL,

PRIMARY KEY CLUSTERED

(

[id]

) ON [PRIMARY],

FOREIGN KEY

(

[place_id]

) REFERENCES [Parking_Place] (

[id]

)

) ON [PRIMARY]

GO

 

Создание функций

 

Для построения некоторых запросов, которые понадобятся в процедурах, очень пригодятся некоторые функции, например, такие как преобразование полного формата даты «DATETIME», в более понятный и удобочитаемый для человека формат «ДД.ММ.ГГГГ», и наоборот. Также понадобятся функции, которые помогут быстро узнать, свободно ли парковочное место, кто был ответственен за парковку в указанное время.

 

· DatetimeToDate – функция преобразующая дату из вида

«0000-00-00 00:00:00.000 » в формат «ДД.ММ.ГГГГ ». В качестве аргумента принимает параметр типа «DATETIME », и возвращает строку длиной 10 символов (VARCHAR(10)).

 

CREATE FUNCTION DatetimeToDate (

@datetime datetime

)

RETURNS VARCHAR(10)

AS

BEGIN

DECLARE @date VARCHAR(20)

SET @date = CONVERT(VARCHAR(2), DAY(@datetime)) + '.' +

CONVERT(VARCHAR(2), MONTH(@datetime)) + '.' +

CONVERT(VARCHAR(4), YEAR(@datetime))

RETURN (@date)

END

GO

 

· IsFree – функция, принимающая в качестве аргумента число типа INT, и возвращающее 1, если парковочное место с таким идентификационным номером свободно, и 0, если нет.

 

CREATE FUNCTION IsFree(@id int) RETURNS INT

AS

BEGIN

DECLARE @result int

IF (EXISTS (SELECT * FROM Operations WHERE id = @id AND time_out LIKE ’’)) SET @result = 1

ELSE SET @result = 0

RETURN @result

END

GO

 

Создание процедур

 

· hireEmployee – процедура предназначена для приема на работу сотрудника. Принимает в качестве параметров 8 аргументов, необходимых нам для приема на работу, такие как имя, контактные и личные данные и информация о занимаемой должности и заработной планет. Также процедура, проверяет, нет ли в базе данных уже сотрудника с указанными именем и фамилией на случай ошибки оператора или случайной отправки двух или более одинаковых запросов на сервер. Если такой сотрудник находится, выводится сообщение оповещающее об этом.

 

CREATE PROCEDURE hireEmployee

@firstname varchar(30),

@lastname varchar(30),

@address varchar(30),

@phone varchar(30),

@cellphone varchar(30),

@birthday datetime,

@post varchar(20),

@salary money

AS

IF EXISTS (SELECT * FROM Employees WHERE firstname = @firstname AND lastname = @lastname)

PRINT 'В базе данных уже существует сотрудник с заданными именем и фамилией.'

ELSE

INSERT INTO Employees (firstname, lastname, address, phone, cellphone, hiredate, birthday, post, salary)

VALUES (@firstname, @lastname, @address, @phone, @cellphone, getdate(), @birthday, @post, @salary)

GO

 

· updateEmployee – процедура обновляет какую-либо информацию о сотруднике стоянки. В качестве параметров принимаются: ID сотрудника, чью информацию необходимо изменить, поле, которое должно быть изменено и новое значение, которое должно быть установлено. Если вторым аргументом указывается недопустимое для изменения поле или строка, с названием которого в таблице Employees не существует столбца, процедура выводит сообщение об ошибке.

 

CREATE PROC updateEmployee

@id int,

@param varchar(255),

@value varchar(255)

AS

IF @param='firstname' UPDATE Employees SET firstname = @value WHERE id=@id

ELSE IF @param='lastname' UPDATE Employees SET lastname = @value WHERE id=@id

ELSE IF @param='address' UPDATE Employees SET address = @value WHERE id=@id

ELSE IF @param='phone' UPDATE Employees SET phone = @value WHERE id=@id

ELSE IF @param='cellphone' UPDATE Employees SET cellphone = @value WHERE id=@id

ELSE IF @param='birthday' UPDATE Employees SET birthday = @value WHERE id=@id

ELSE IF @param='post' UPDATE Employees SET post = @value WHERE id=@id

ELSE IF @param='salary' UPDATE Employees SET salary = CONVERT(money, @value) WHERE id=@id

ELSE PRINT 'Данный параметр не может быть изменен, либо его не существует.'

GO

 

· fireEmployee – процедура предназначена для увольнения сотрудника с указанным идентификационным номером. При успешном выполнении процедуры, значение поля «fired » у сотрудника стоянки меняется на «TRUE », а в поле «firedate» выставляется текущая дата. Если по ошибке сотрудник, с указанным ID уже был уволен, или такого сотрудника вообще не существует в таблице Employees, об этом выводит сообщение.

 

CREATE PROCEDURE fireEmployee

@id int

AS

IF EXISTS (SELECT * FROM Employees WHERE id = @id AND fired = 'FALSE')

BEGIN

UPDATE Employees SET fired = 'TRUE', firedate = getdate() WHERE id = @id

PRINT 'Сотрудник уволен.'

END

ELSE IF EXISTS (SELECT * FROM Employees WHERE id = @id AND fired = 'TRUE')

PRINT 'Ранее сотрудник уже был уволен.'

ELSE

PRINT 'Сотрудника с указаными ID не существует.'

GO

 

· showEmployees – процедура предназначена для вывода информации о всех сотрудниках. При этом может быть указан необязательный параметр @status, который служит для вывода либо только текущих сотрудников магазина «hired », либо только уволенных сотрдуников «fired ». Если данный параметр не указан, абсолютно все сотрудники когда-либо работающие в магазине.

 

CREATE PROC showEmployees

@status VARCHAR(5) = ‘’

AS

IF (@status = 'hired')

SELECT firstname, lastname, address, phone, cellphone, dbo.DatetimeToDate(hiredate), dbo.DatetimeToDate(birthday), post, salary FROM Employees WHERE fired = 'FALSE'

ELSE IF (@status = 'fired')

SELECT firstname, lastname, address, phone, cellphone, dbo.DatetimeToDate(hiredate), dbo.DatetimeToDate(birthday), post, salary, fired, dbo.DatetimeToDate(firedate) FROM Employees WHERE fired = 'TRUE'

ELSE

SELECT id, firstname, lastname, address, phone, cellphone, dbo.DatetimeToDate(hiredate) AS hiredate, dbo.DatetimeToDate(birthday) AS birthday, post, salary, fired, dbo.DatetimeToDate(firedate) AS firedate FROM Employees

GO

 

· showFreePlace – процедура выводит информацию о свободных парковочных местах.

 

CREATE PROC showFreePlace

AS

SELECT * FROM Parking_Place WHERE dbo.isFree(id)

GO

 

· updateParkingPrice – простая процедура предназначена для изменения цены парковочного места.

 

CREATE PROC updateParkingPlace

@id int,

@value varchar(50)

AS

BEGIN

DECLARE @price money

 

SELECT @price = price FROM Parking_Place WHERE id = @id

BEGIN

UPDATE Parking_Place SET price = CONVERT(money, @value)

PRINT 'Цена парковочного места "' + @id + '" была изменена с ' + CONVERT(varchar(10), @price) + ' на ' + CONVERT(varchar(10), CONVERT(money, @value)) + '.'

END

ELSE PRINT 'Произошла ошибка в записи.'

END

GO

 

· updateParking – когда парковочное место освободится то понадобится процедура при помощи которой можно будет отобразить это в таблице.

 

CREATE PROC updateParkingPlace

@id int

AS

BEGIN

UPDATE Operations SET firedate = getdate() WHERE id = @id

PRINT 'Данные успешно внесены.'

END

 

· showDohod – выводится информация о выручке. Так же есть возможность вывести информация за определенный промежуток времени.

 

CREATE proc showDohod

@begin_date varchar(10) = '',

@end_date varchar(10) = ''

AS

BEGIN

/* Если указаны даты, преобзауем их в DATETIME. */

DECLARE @first_date datetime, @second_date datetime

IF (@begin_date!= '') SET @first_date = dbo.DateToDatetime(@begin_date)

IF (@end_date!= '') SET @second_date = dbo.DateToDatetime(@end_date)

 

/* Если указан период, за который необходимо вывести информацию. */

IF (@begin_date!= '' AND @end_date!= '')

SELECT sum(price) as 'Сумма '

FROM Operations

WHERE datetime BETWEEN @first_date AND @second_date

 

/* Если указана только первая дата, выводим информацию с той даты

по сегодняшний день. */

ELSE IF (@begin_date!= '' AND @end_date = '')

SELECT sum(price) as 'Сумма '

FROM Operations

WHERE datetime BETWEEN @first_date AND DATEADD(day, 1, getdate())

 

END

GO

 

Создание триггеров

 

· insertTimeOut – данный триггер прописывается для таблицы «Operations », и предназначен для того, что не возможно было вставить время освобождения парковочного места если время приезда не указано. В противном случае могут возникнуть логические ошибки.

 

CREATE TRIGGER insertTimeOut ON Operations

FOR INSERT

AS

BEGIN

 

DECLARE @in

DECLARE @out

SELECT @in = time_in, @out = time_out

FROM inserted

 

IF (@time_in = '')

PRINT (‘Вы не указали дату приезда.’)

ELSE IF

PRINT (‘Спасибо что воспользовались нашей парковкой.’)

END

GO

 


 

Оглавление

Введение. 2

1. Концептуальная модель. 2

1.1 Определение сущностей. 2

1.2 Определение типов связей между сущностями. 3

1.3 Определение атрибутов. 3

1.4 Определение доменов. 4

1.4 Определение первичных и потенциальных ключей. 5

1.5 Диаграмма. 5

2. Логическая модель. 5

3. Физическая модель. 6

3.1 Схема связей. 6

3.2 Создание таблиц. 6

3.3 Создание функций. 8

3.4 Создание процедур. 9

3.5 Создание триггеров. 13

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-23 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: