Смекни!
smekni.com

Разработка базы данных 3 (стр. 2 из 2)

Теперь подведем итоги формирования предварительных отношений.

Вкладчик по приходу в банк заполняет заявление, где указывает Имя и данные паспорта. Ему открывают счет (отношение Вклад), за которым закреплен какой-то номер. На этот счет вкладчик вносит денежные средства определенной купюры. С банком оговариваются вид вклада и проценты.

Далее, если вкладчик захочет сделать какую-либо операцию с вкладом (отношение Вклад_Операция), то ему нужно представить номер счета и выбрать операцию из списка (операции).

Архив должен хранить данные о закрытых вкладах. То есть о таких вкладах, к которым применена операция Закрытие. А в полученной диаграмме Архив связан с отношениями Операции и Вклад.

Более рационально представить зависимость Архива от отношения Вклад_Операция, поскольку в этом случае будет возможность отслеживать вклады, к которым применена операция Закрытие и которые должны поместиться в архив.

1.6 Построение конечных отношений

На основании приведенных рассуждений изменим диаграмму таким образом:

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

Вкладчики (Investors).

ФИО (InvestorName) – это строковый тип переменной длины VARCHAR. Для его размещения должно хватить 50 символов, поскольку не так уж много имен, количество символов в котором превосходит 50. А тип переменной длины, поскольку размер типа будет определятся при вводе данных.

Данные паспорта (PasportSN) (первичный ключ) – возьмем Российский стандарт паспорта серия и номер. Серия состоит из 4 цифр, а номер – из 6. Плюс можно добавит пробел, чтобы разделить серию и номер. Для его хранения воспользуемся типом данных CHAR с количеством символов равным 11 (6+4+1).

Номер телефона (PhoneNumber) – тип данных CHAR. Все телефоны имеют федеральный формат номера, а именно: 8-9ХХ-ХХХ-ХХ-ХХ.

Считаем количество символов и получаем 15. Причем номер телефона должен быть уникальным для каждого вкладчика.

Вклады (Investments).

Рассмотрим таблицу, содержащую информацию о видах вклада:

У Сбербанка вообще много видов вкладов. Однако из всего множества были выбраны основные, так как другие предваряются словами «Плюс», «Универсал» и др.

Теперь можно формировать информацию о типах данных.

Номер Счета (AccountNumber) (первичный ключ) – выберем формат номера счета, состоящий из 6 символов. Тогда для его размещения хватит типа INT.

Вид Вклада (Type) – тип VARCHAR. Количество символов будет равняться максимальному количеству символов вида вклада. Как видно из таблицы это 7 символов.

Вкладываемая сумма (InvSum) – тип данных INT. В таблице указано, от какой суммы возможен вклад.

Проценты (Per_Cents) – проценты вклада тип вещественный FLOAT.

Валюта вклада (Currency) – тип данных VARCHARс количеством символов, равным 6.

Дата открытия вклада (OpenningDate) – тип данных DATETIME

Данные паспорта (PasportSN) – VARCHAR (11) - внешний ключ, ссылающийся на отношение Вклады.

Операции (Operations).

Идентификатор операции (OID) (первичный ключ) – тип данных INT, причем этот атрибут должен быть автоинкрементируем, то есть увеличиваться на 1 с каждой новой вставкой данных.

Название операции (Operation) – тип данных VARCHAR. В базе данных будут использоваться следующий операции о вкладам: пополнение (Replenishment), снятие (Withdrawals), закрытие (Closure) и перевод средств на другой счет (Transfer). Считаем количество символов у всех названий операций и получаем 13.

Вклад_Операция (Investment_Operation)

Идентификатор (IOID) (первичный ключ) – автоинкрементируемый атрибут типа INT.

Оперируемая сумма (OperatedSum) – тип данных INT.

Счет места назначения (DestAccount) – тип данных INT, как и в поле AccountNumber.

Дата совершения операции (OpDate) – тип DATETIME.

Номер счета (AccountNumber) (внешний ключ на отношение Вклады) – тип INT.

Номер Операции (OID) (внешний ключ на таблицу Операции) – тип INT.

Архив (Archive)

Идентификатор архива (AID) (первичный ключ) – автоинкрементируемый атрибут типа INT.

Идентификатор (IOID) (внешний ключ на отношение Вклад_Операция)

Данные паспорта (PasportSN) (внешний ключ на отношение Вкладчики) –тип VARCHAR (11)

Дата закрытия (DateOfClosure) – тип DATETIME.

1.7 Конечная диаграмма базы данных

Теперь обобщая все сказанное выше средствами языка запросов SQL, скрипты которого приведены в приложениях, создаем диаграмму базы данных:

Заключение

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

Список используемой литературы

Роберт Виейра «Программирование баз данных».

Используемые интернет ресурсы:

http://www.info-system.ru/designing/methodology/er/er_theory_er.html

Приложения

Рассмотрим реализацию базы данных на языке SQL

Приложение №1 Построение отношений.

CREATE TABLE Investors

(

IDInvestor INT NOT NULL IDENTITY,

InvestorName VARCHAR (50) NOT NULL,

PasportSN CHAR (11) NOT NULL,

PhoneNumber CHAR (15) NOT NULL,

PRIMARY KEY (PasportSN),

UNIQUE (PhoneNumber)

)

CREATE TABLE Investments

(

IDInvestment INT NOT NULL IDENTITY,

AccountNumber INT NOT NULL,

Type VARCHAR (7) NOT NULL,

InvSum INT,

Per_Cents FLOAT NOT NULL,

Currency VARCHAR (6) NOT NULL,

OpenningDate DATETIME,

PasportSN CHAR (11) NOT NULL,

PRIMARY KEY (AccountNumber),

FOREIGN KEY (PasportSN) REFERENCES Investors(PasportSN)

)

CREATE TABLE Operations

(

OID INT NOT NULL IDENTITY,

Operation VARCHAR (15) NOT NULL,

PRIMARY KEY (OID)

)

CREATE TABLE Investment_Operation

(

IOID INT NOT NULL IDENTITY,

AccountNumber INT NOT NULL,

OID INT NOT NULL,

OperateSum INT,

DestAccount INT NOT NULL,

OpDate DATETIME,

PRIMARY KEY (IOID),

FOREIGN KEY (AccountNumber) REFERENCES Investments(AccountNumber),

FOREIGN KEY (OID) REFERENCES Operations(OID)

)

CREATE TABLE Archive

(

AID INT NOT NULL IDENTITY,

IOID INT NOT NULL,

PasportSN CHAR (11) NOT NULL,

DateOfClosure DATETIME,

PRIMARY KEY (AID),

FOREIGN KEY (IOID) REFERENCES Investment_Operation(IOID),

FOREIGN KEY (PasportSN) REFERENCES Investors(PasportSN)

)

Приложение №2. Заполнение базы данных первичными данными

Заполняем вкладчиков

INSERT INTO Investors(InvestorName,PasportSN,PhoneNumber)

VALUES ('John McCallister','6705 123876','8-922-420-52-58')

INSERT INTO Investors (InvestorName, PasportSN, PhoneNumber)

VALUES ('John Peter Rys Davis', '6708 321546', '8-933-675-23-43')

INSERT INTO Investors (InvestorName, PasportSN, PhoneNumber)

VALUES ('Ivan Safin', '6758 121543', '8-732-875-23-43')

INSERT INTO Investors(InvestorName, PasportSN, PhoneNumber)

VALUES ('Dimitriy Ozerov', '5691 324567', '8-922-320-65-64')

INSERT INTO Investors (InvestorName, PasportSN, PhoneNumber)

VALUES ('Alecsey Ivanyakov', '6103 391456', '8-546-234-13-11')

INSERT INTO Investors (InvestorName, PasportSN, PhoneNumber)

VALUES ('Andrey Verbickiy', '6870 345656', '8-970-231-11-21')

INSERT INTO Investors (InvestorName, PasportSN, PhoneNumber)

VALUES ('Ryslan Golov', '6310 342187', '8-980-514-22-36')

INSERT INTO Investors (InvestorName, PasportSN, PhoneNumber)

VALUES ('Andreas Alson', '5416 867412', '8-950-310-16-17')

Заполняем вклады

INSERT INTO Investments(AccountNumber,Type,InvSum,Per_Cents,Currency,OpenningDate,PasportSN)

VALUES (623613,'Deposit',10000,9.5,'Dollar','11.12.2008 17:10','6705 123876')

INSERT INTO Investments(AccountNumber,Type,InvSum,Per_Cents,Currency,OpenningDate,PasportSN)

VALUES (571234,'Demand',80,0.1,'Euro','12.1.2008 12:00','6103 391456')

INSERT INTO Investments(AccountNumber,Type,InvSum,Per_Cents,Currency,OpenningDate,PasportSN)

VALUES (417232,'Pension',1000,9.5,'Rouble','06.13.2008 15:00','5691 324567')

INSERT INTO Investments(AccountNumber,Type,InvSum,Per_Cents,Currency,OpenningDate,PasportSN)

VALUES (254178,'Term',5000,2.1,'Dollar','10.25.2008 14:15','6708 321546')

INSERT INTO Investments(AccountNumber,Type,InvSum,Per_Cents,Currency,OpenningDate,PasportSN)

VALUES (712345,'Demand',10000,0.25,'Dollar','11.27.2008 18:03','6758 121543')

INSERT INTO

Investments(AccountNumber,Type,InvSum,Per_Cents,Currency,OpenningDate,PasportSN)

VALUES (322145,'Pension',5000,0.25,'Rouble','12.20.2008 18:00', '6870 345656')

INSERT INTO

Investments(AccountNumber,Type,InvSum,Per_Cents,Currency,OpenningDate,PasportSN)

INSERT INTO

VALUES (812345,'Deposit',15000,8.25,'Rouble','10.28.2008 17:00', '6310 342187')

INSERT INTO

Investments(AccountNumber,Type,InvSum,Per_Cents,Currency,OpenningDate,PasportSN)

VALUES (325091,'Deposit',50000,5.75,'Dollar','11.23.2008 19:30', '5416 867412'')

Заполняем Операции

INSERT INTO Operations(Operation)

VALUES ('Closure')

INSERT INTO Operations(Operation)

VALUES ('Withdrawals')

INSERT INTO Operations(Operation)

VALUES ('Transfer')

INSERT INTO Operations(Operation)

VALUES ('Replenishment')

Заполняем Вклад_Операция

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (2,254178,100,254178,'02.10.2009 15:40')

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (3,417232,200,535721,'01.16.2009 12:30')

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (4,571234,95,571234,'03.01.2009 11:00')

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (2,623613,2000,623613,'02.03.2009 17:23')

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (4,712345,10000,712345,'04.06.2009 13:40')

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (1,254178,0,254178,'12.05.2009 17:40')

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (1,712345,0,712345,'12.02.2009 11:24')

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (1,417232,0,417232,'12.10.2009 15:33')

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (2,322145,100, 322145,'06.29.2009 13:25')

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (4,812345,5000, 812345,'05.28.2009 17:00')

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (4,812345,5000, 812345,'05.15.2009 13:04')

INSERT INTO Investment_Operation(OID,AccountNumber,OperateSum,DestAccount,OpDate)

VALUES (3,325091,5000, 437913,'11.23.2008 19:30')

Заполняем Архив

INSERT INTO Archive (IOID,PasportSN,DateOfClosure)

VALUES (6, '6708 321546' ,'12.05.2009 17:40')

INSERT INTO Archive (IOID,PasportSN,DateOfClosure)

VALUES (7, '6758 121543' ,'12.02.2009 11:24')

INSERT INTO Archive (IOID,PasportSN,DateOfClosure)

VALUES (8, '5691 324567','12.10.2009 15:33')

Приложение №3 Триггер

При снятии средств проверка на их наличие

CREATE TRIGGER T1

ON Investment_Operation FOR INSERT

AS IF EXISTS (SELECT InvSum FROM Investments Inv

JOIN INSERTED I ON Inv.AccountNumber = I.AccountNumber

WHERE InvSum = 0 AND OID = 2)

BEGIN

ROLLBACK

PRINT 'Sorry! You can not withdraw money from an account in which there is no money'

END

Приложение №4. Представления и запросы

Представления

1. Список процентов банка по вкладам за месяц

CREATE VIEW V1

AS

SELECT AccountNumber, Per_Cents FROM Investments

WHERE MONTH(OpenningDate) = 11

2. Количество операций по каждому вкладу за месяц

CREATE VIEW V2

AS

SELECT AccountNumber, COUNT(OID) AS 'Number of Operations' FROM Investment_Operation

WHERE MONTH(OpDate) = 2

Запросы

1. Список закрытых вкладов за текущий месяц

SELECT AccountNumber FROM Investment_Operation

WHERE OID = 1 AND MONTH(OpDate) = MONTH(GETDATE())

2. Количество вкладчиков по каждому виду вклада

SELECT Type, COUNT(InvestorName) AS 'Number of Investors' FROM Investors It

JOIN Investments Im ON It.PasportSN = Im.PasportSN

GROUP BY Type