
- •Оглавление.
- •Введение.
- •Спецификация требований.
- •Формы первичных документов.
- •Концептуальное проектирование. Создание er-модели предметной области.
- •Логическое проектирование. Построение и проверка реляционной модели данных.
- •Исключение из концептуальной модели особенностей несовместимых с реляционной моделью.
- •Формирование набора отношений.
- •Реляционная схема.
- •Определение ограничений целостности.
- •Физическое проектирование и реализация базы данных в ms sql Server. Определение состава и структуры таблиц.
- •Реализация ограничений целостности.
- •Проектирование и разработка пользовательских представлений.
- •Заключение.
- •Список используемых источников.
Реализация ограничений целостности.
Ограничения целостности были реализованы следующим способом:
book_lending (CK_book_lending):
USE [Library]
GO
ALTER TABLE [dbo].[book_lending] WITH CHECK ADD CONSTRAINT [CK_book_lending] CHECK (([lending_date]<[delivery_date_fact] OR [delivery_date_fact]=NULL))
GO
ALTER TABLE [dbo].[book_lending] CHECK CONSTRAINT [CK_book_lending]
GO
book_lending (CK_book_lending_1):
USE [Library]
GO
ALTER TABLE [dbo].[book_lending] WITH CHECK ADD CONSTRAINT [CK_book_lending_1] CHECK (([lending_date]<[delivery_date_plan] OR [delivery_date_plan]=NULL))
GO
ALTER TABLE [dbo].[book_lending] CHECK CONSTRAINT [CK_book_lending_1]
GO
edition (DF_edition_edition_format_id):
USE [Library]
GO
ALTER TABLE [dbo].[edition] ADD CONSTRAINT [DF_edition_edition_format_id] DEFAULT ((1)) FOR [edition_format_id]
GO
edition (DF_edition_edition_genre_id):
USE [Library]
GO
ALTER TABLE [dbo].[edition] ADD CONSTRAINT [DF_edition_edition_genre_id] DEFAULT ((3)) FOR [edition_genre_id]
GO
edition (DF_edition_edition_number):
USE [Library]
GO
ALTER TABLE [dbo].[edition] ADD CONSTRAINT [DF_edition_edition_number] DEFAULT ((0)) FOR [edition_number]
GO
edition (DF_edition_edition_pubhouse_id):
USE [Library]
GO
ALTER TABLE [dbo].[edition] ADD CONSTRAINT [DF_edition_edition_pubhouse_id] DEFAULT ((1)) FOR [edition_pubhouse_id]
GO
edition_format (CK_edition_format):
USE [Library]
GO
ALTER TABLE [dbo].[edition_format] WITH CHECK ADD CONSTRAINT [CK_edition_format] CHECK (([format_penalty]>=(0)))
GO
ALTER TABLE [dbo].[edition_format] CHECK CONSTRAINT [CK_edition_format]
GO
library_card (CK_library_card_reader_pass_n):
USE [Library]
GO
ALTER TABLE [dbo].[library_card] WITH CHECK ADD CONSTRAINT [CK_library_card_reader_pass_n] CHECK (([reader_pass_n] like '[0-9][0-9][0-9][0-9][0-9][0-9]'))
GO
ALTER TABLE [dbo].[library_card] CHECK CONSTRAINT [CK_library_card_reader_pass_n]
GO
library_card (CK_library_card_reader_pass_s):
USE [Library]
GO
ALTER TABLE [dbo].[library_card] WITH CHECK ADD CONSTRAINT [CK_library_card_reader_pass_s] CHECK (([reader_pass_s] like '[0-9][0-9][0-9][0-9]'))
GO
ALTER TABLE [dbo].[library_card] CHECK CONSTRAINT [CK_library_card_reader_pass_s]
GO
Проектирование и разработка пользовательских представлений.
В ходе физического моделирования были спроектированы 3 пользовательских представления:
view_book_lending (Номер читательского билета, Фамилия, Имя, Отчество, Издание, Автор, Жанр, Формат издания, Издательство, Дата выдачи, Дата приёма (фактическая), Дата приёма (плановая), Пени) — данные о выдаче изданий пользователям на руки.
view_edition (Название издания, Автор, Год издания, Общее количество, Оставшееся количество, Библиографические особенности, Жанр, Формат, Издательство, Номер издания) — список изданий библиотеки.
view_library_card (Номер читательского билета, Фамилия, Имя, Отчество, Адрес, Телефон, Серия паспорта, Номер паспорта) — данные о читателях.
Реализованы данные представления были следующим образом.
view_book_lending
SELECT TOP (100) PERCENT dbo.library_card.library_card_number AS [Номер читательского билета], dbo.library_card.reader_surname AS Фамилия,
dbo.library_card.reader_first_name AS Имя, dbo.library_card.reader_middle AS Отчество, dbo.edition.edition_name AS Издание,
dbo.edition.edition_author AS Автор, dbo.genre.genre_name AS Жанр, dbo.edition_format.format_name AS [Формат издания],
dbo.publishing_house.pubhouse_name AS Издательство, book_lending_1.lending_date AS [Дата выдачи],
book_lending_1.delivery_date_fact AS [Дата приёма (фактическая)], book_lending_1.delivery_date_plan AS [Дата приёма (плановая)],
book_lending_1.penalty AS Пени, dbo.edition.edition_id AS [ID издания]
FROM dbo.book_lending AS book_lending_1 INNER JOIN
dbo.edition ON book_lending_1.edition_id = dbo.edition.edition_id INNER JOIN
dbo.edition_format ON dbo.edition.edition_format_id = dbo.edition_format.format_id INNER JOIN
dbo.genre ON dbo.edition.edition_genre_id = dbo.genre.genre_id INNER JOIN
dbo.library_card ON book_lending_1.library_card_id = dbo.library_card.library_card_id INNER JOIN
dbo.publishing_house ON dbo.edition.edition_pubhouse_id = dbo.publishing_house.pubhouse_id
view_edition
SELECT dbo.edition.edition_name AS [Название издания], dbo.edition.edition_author AS Автор, dbo.edition.edition_year AS [Год издания], dbo.edition.edition_count AS [Общее количество], dbo.edition.edition_count -
(SELECT COUNT(*) AS Expr1
FROM dbo.book_lending
WHERE (delivery_date_fact IS NULL) AND (edition_id = dbo.edition.edition_id)) AS [Оставшееся количество], dbo.edition.edition_biblfeatures AS [Библиографические особенности], dbo.genre.genre_name AS Жанр, dbo.edition_format.format_name AS Формат, dbo.publishing_house.pubhouse_name AS Издательство, dbo.edition.edition_number AS [Номер издания]
FROM dbo.edition INNER JOIN
dbo.edition_format ON dbo.edition.edition_format_id = dbo.edition_format.format_id INNER JOIN
dbo.genre ON dbo.edition.edition_genre_id = dbo.genre.genre_id INNER JOIN
dbo.publishing_house ON dbo.edition.edition_pubhouse_id = dbo.publishing_house.pubhouse_id
view_library_card
SELECT library_card_number AS [Номер читательского билета], reader_surname AS Фамилия, reader_first_name AS Имя, reader_middle AS Отчество, reader_address AS Адрес, reader_phone AS Телефон, reader_pass_s AS [Серия пасспорта], reader_pass_n AS [Номер пасспорта]
FROM dbo.library_card
Для выполнения всех необходимых транзакций, были созданы следующие хранимые процедуры, связанные с этими представлениями:
view_book_lending
booklendinginsert — добавление записи о выдачи издания на руки читателю:
ALTER PROCEDURE [dbo].[booklendinginsert]
@librarycardid int,
@editionid int,
@lendingdate datetime,
@deliverydatefact datetime,
@deliverydateplan datetime,
@penalty money
AS
BEGIN
SET @lendingdate = SYSDATETIME()
if (
(select edition_count from edition where edition_id = @editionid) -
(select count(*) from book_lending where (edition_id=@editionid) and (delivery_date_fact <> 0))
)>0
INSERT INTO book_lending VALUES (@librarycardid, @editionid, @lendingdate, @deliverydatefact, @deliverydateplan, @penalty)
ELSE BEGIN RETURN @@ERROR END
SELECT @librarycardid = @@IDENTITY
END
booklendingupd — обновление записи о выдаче книги читателю с добавлением даты возврата и добавлением суммы пени (если книга сдана с опозданием):
ALTER PROCEDURE [dbo].[booklendingupd]
@booklendingid int,
@deliverydatefact datetime
AS
BEGIN
UPDATE book_lending SET
delivery_date_fact = @deliverydatefact,
penalty = CASE
WHEN delivery_date_fact > delivery_date_plan THEN
(-DATEDIFF(day, delivery_date_fact, delivery_date_plan))*(select format_penalty from edition_format ef
inner join edition ed on ef.format_id=ed.edition_format_id
inner join book_lending bl on ed.edition_id=bl.edition_id
where bl.book_lend_id=@booklendingid)
ELSE NULL
END
WHERE book_lend_id = @booklendingid
END
booklendingdel – удаление записи о выдаче издания читателю:
ALTER PROCEDURE [dbo].[booklendingdel]
@booklendingid int
AS
BEGIN
DELETE FROM book_lending WHERE book_lend_id = @booklendingid
END
dolzhniki – возврат списка читателей, не сдавших издание или имеющих неуплаченное пени
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION dolzhniki()
RETURNS TABLE
AS
RETURN
(
SELECT * FROM view_book_lending
WHERE ([Дата приёма (плановая)]<[Дата приёма (фактическая)]) OR ([Дата приёма (фактическая)] is NULL)
)
GO
bookkeepersreturn – возвращение записей о выдаче книги по её номеру (экземпляры, находящиеся на руках):
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION bookkeepersreturn
(
@editionid int
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM view_book_lending
WHERE ([ID издания]=@editionid) and ([Дата приёма (фактическая)] is not NULL)
)
GO
booklendingreturn – возвращение истории выдачи конкретного издания:
USE [Library]
GO
/****** Object: UserDefinedFunction [dbo].[bookkeepersreturn] Script Date: 14.06.2012 12:23:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[booklendingreturn]
(
@editionid int
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM view_book_lending
WHERE ([ID издания]=@editionid)
booklendonday – возвращение списка выданных изданий по дате:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION booklendonday
(
@date date
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM view_book_lending
WHERE cast([Дата выдачи] as date) = @date
)
GO
view_edition
editioninsert – добавление издания в список изданий библиотеки:
ALTER PROCEDURE [dbo].[editioninsert]
@editionid int,
@editionname varchar(50),
@editionauthor varchar(50),
@editiongenreid int,
@editionformatid int,
@editionpubhouseid int,
@editionyear date,
@editioncount int,
@editionbiblfutures varchar(100),
@editionnumber int
AS
BEGIN
INSERT INTO edition VALUES (@editionname, @editionauthor, @editiongenreid, @editionformatid,
@editionpubhouseid, @editionyear, @editioncount, @editionbiblfutures, @editionnumber)
SELECT @editionid = @@IDENTITY
IF @@ERROR <>0
PRINT 'Ошибка:'+ltrim(str(@@error))
END
editionupd – редактирование информации об издании:
ALTER PROCEDURE [dbo].[editionupd]
@editionid int,
@editionname varchar(50),
@editionauthor varchar(50),
@editiongenreid int,
@editionformatid int,
@editionpubhouseid int,
@editionyear date,
@editioncount int,
@editionbiblfutures varchar(100),
@editionnumber int
AS
BEGIN
UPDATE edition SET
edition_name = @editionname,
edition_author = @editionauthor,
edition_genre_id = @editiongenreid,
edition_format_id = @editionformatid,
edition_pubhouse_id = @editionpubhouseid,
edition_year = @editionyear,
edition_count = @editioncount,
edition_biblfeatures = @editionbiblfutures,
edition_number = @editionnumber
WHERE edition_id = @editionid
IF @@ERROR <>0
PRINT 'Ошибка:'+ltrim(str(@@error))
END
editiondel — удаление издания из списка изданий:
ALTER PROCEDURE [dbo].[editiondel]
@editionid int
AS
BEGIN
DELETE FROM edition WHERE edition_id = @editionid
END
editionbydate – возвращение списка изданий, изданных:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION editionbydate
(
@datea date,
@dateb date
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM view_edition
WHERE ([Год издания]>@datea) and ([Год издания]<@dateb)
)
GO
Таким образом реализованы основные хранимые процедуры и функции, используемые для решения требуемых от ИС «Библиотека» задач.