Связь
|
Объекты
|
Показатель кардинальности
|
Степень участия
|
Contain_EE
|
Exhibit AgeID
|
1 : N 1 : N
|
Полная Полная
|
Contain_RE
|
Exhibit ExTypeID
|
1 : N 1 : N
|
Полная Полная
|
Contain_ER
|
Exhibit PlaceID
|
1 : N 1 : N
|
Полная Полная
|
Contain_RR
|
Exhibit ArchaeologistID
|
1 : N 1 : N
|
Полная Полная
|
Have_EE
|
Archaeologist UniversityID
|
1 : N 1 : N
|
Полная Полная
|
Have_RE
|
Era BeginDate
|
1 : N 1 : N
|
Полная Полная
|
Have_ER
|
Era EndDate
|
1 : N 1 : N
|
Полная Полная
|
Have_RR
|
Era KindOfEraID
|
1 : N 1 : N
|
Полная Полная
|
На рисунке 2 представлена концептуальная модель базы данных.
Рисунок 2 - Концептуальная модель БД
3. Разработка
базы данных и программных приложений к ней
3.1
Логическая модель БД с описанием
На данном этапе производится упрощение концептуальной модели, а затем ее
преобразование в реляционную модель.
В реляционной модели данных (РБД) связь типа "многие ко многим"
не может быть представлена напрямую. Она убирается путем добавления новых
таблиц.
В данной реляционной базе данных все объекты изначально были
спроектированы так, что не было избыточных связей и связей "многие ко
многим", поэтому в данном случае логическая модель совпадает с
концептуальной (рис. 3).
Рисунок 3 - Логическая модель БД
Основные объекты базы данных:
) "Archaeologist"
используется для хранения данных об археологах. Данная таблица содержит
идентификатор, имя и возраст археолога, а также ссылку на университет, в
котором он работает.
) "University" содержит данные об университетах. Данная таблица содержит
идентификатор, название и город, в котором находится университет.
) "Exhibit"
используется для хранения экспонатов. Данная таблица хранит уникальный
идентификатор, наименование, место нахождения, автора раскопки, тип и эпоху, к
которой принадлежит экспонат.
) "Place"
используется для хранения мест раскопок. Данная таблица хранит уникальный
идентификатор и наименование места нахождения.
) "Era"
используется для хранения эпох. Данная таблица хранит уникальный идентификатор
и наименование эпохи, врем начала и конца эпохи, а также тип, к которому
принадлежит.
) "KindOfEra"
используется для хранения типов эпох. Данная таблица хранит уникальный
идентификатор и наименование типа эпохи.
) "ExType"
используется для хранения типов экспонатов. Данная таблица хранит уникальный
идентификатор и наименование типа экспоната.
.2 ER-диаграмма с описанием
На основе расширенной концептуальной модели создаем БД "Crocodile" в Microsoft SQL Server 2012. Диаграмма БД выглядит следующим образом (рис.
4):
Рисунок 4 - Реляционная модель БД
3.3 Перечень
функций программы
Проектируемое клиент-серверное приложение должно выполнять следующие
функции:
) Осуществление аутентификации;
) Вывод всех экспонатов;
) Выбор нужной таблицы из всех таблиц базы;
) Добавление элементов в выбранную таблицу;
) Изменение и удаление выбранного элемента;
) Поиск по имени элемента.
4.
Руководство пользователя
При запуске приложения пользователь видит стартовое окно, в котором
представлен список всех экспонатов (рис. 5).
Рисунок 5 - Стартовое окно программы
Нажав на экспонат можно увидеть подробную информацию о нём (рис. 6).
Рисунок 6 - Подробная информация об экспонате
Для того, чтобы иметь возможность просматривать таблицы, необходимо иметь
учётную запись менеджера, нажав на "Login" в правой верхней части экрана вводим логин
"manager" и пароль "manager" (рис. 7).
Рисунок 7 - Аутентификация
Менеджер имеет привилегии только для просмотра содержимого таблиц (рис.
8).
Рисунок 8 - Управление с учётной записью менеджера
Для того, чтобы иметь возможность модифицировать таблицы, необходимо
авторизоваться под учётной записью администратора (логин "admin" пароль "admin"), нажав на "Login" в правой верхней части экрана
(рис. 9).
Рисунок 9 - Окно управления
Для изменения элемента необходимо нажать кнопку "Edit" (рис. 10).
Рисунок 10 - Изменение элемента
При попытке удаления программа просит подтверждения, после получения
которого удаляет элемент из таблицы (рис. 11).
Рисунок 11 - Изменение элемента
Заключение
В заключении хочется отметить важность использования реляционных баз
данных. Благодаря существованию такого понятия, как базы данных, многие
процессы могут быть легко автоматизированы, что достаточно полезно для самых
различных предприятий и компаний. В современном мире сильно ощутим
информационный рывок. Нас стал окружать огромный объем информации. Информация
для человека играет немаловажную роль, поэтому основной из задач человечества
является обработка данной информации.
Для того чтобы обеспечить наиболее эффективную работу предприятий, все
документы учета товара стали хранить в электронном виде. Базы данных получили
широкое применение.
Данная работа позволила нам еще раз убедиться в актуальности изученной
темы.
Список
использованных источников
1. Малыхина М.П. Базы данных:
основы, проектирование, использование: учебное пособие".-3-е изд. СПб.:
БХВ-Петербург, 2007. -528 с.
2. Роберт Уолтерс и др. SQL Server 2012: ускоренный
курс для профессионалов./Пер. с англ. - М.: Издательский дом
"Вильямс", 2014. -768 с.
3. Александр Волоха. Microsoft SQL Server 2012. Новые возможности.
- СПб: Питер, 2012.- 304 с.
4. Сеппа Д. Microsoft
ADO.BET/Пер. с англ.- М.; Издательско-торговый дом "Русская
редакция", 2003. -640 стр.
5. Нейгел, Кристиан, Ивьен,
Билл, Глинн, Джей, Скиннер, Уотсон, Карли. C# 2005 и платформа .NET 3.0 для
профессионалов.; Пер. с англ. - М.: ООО "И.Д.Вильямс", 2008.-
1376+416 (на CD) с.: ил.
Приложение А
Листинг программы:
Класс
MainViewModel:
using
ArchMuseumManager.Infrastructure;System;System.Collections.Generic;System.Linq;System.Text;System.Threading.Tasks;ArchMuseumManager.DAL.Entities;System.Collections.ObjectModel;System.Windows;MahApps.Metro;ArchMuseumManager.ViewModels
{class MainViewModel : BaseViewModel
{bool isLogging;bool IsLogging
{{ return isLogging; }{ isLogging = value;
NotifyPropertyChanged(); }
}ApplicationUser currentUser;ApplicationUser
CurrentUser
{{ return currentUser; }{ currentUser =
value; NotifyPropertyChanged(); }
}Exhibit selectedExhibit;Exhibit
SelectedExhibit
{{ return selectedExhibit; }{
selectedExhibit = value; NotifyPropertyChanged(); }
}ObservableCollection<Exhibit>
Exhibits
{{ return Repository.Exhibits; }{
NotifyPropertyChanged(); }
}void Login(string login, string password)
{user = Repository.Users.FirstOrDefault(u
=> u.Login == login && u.Password == password);(user == null)
{.Show("Incorrect login");;
}
{= user;= false;();
}
}void ChangeWindowTheme()
{theme =
ThemeManager.DetectAppStyle(Application.Current);(CurrentUser != null)
{.ChangeAppStyle(Application.Current,.GetAccent("Mauve"),.GetAppTheme("BaseLight"));
}
{.ChangeAppStyle(Application.Current,.GetAccent("Olive"),.GetAppTheme("BaseLight"));
}
}RelayCommand logOutCommand;RelayCommand
LogOutCommand
{
{(logOutCommand == null)= new RelayCommand(p
=> LogOut());logOutCommand;
}
}void LogOut()
{= null;();
}RelayCommand readMoreCommand;RelayCommand
ReadMoreCommand
{
{(readMoreCommand == null)= new RelayCommand(p
=> ReadMore(p));readMoreCommand;
}RelayCommand
closeReadMoreCommand;RelayCommand CloseReadMoreCommand
{
{(closeReadMoreCommand == null)= new
RelayCommand(p => SelectedExhibit = null);closeReadMoreCommand;
}
}RelayCommand openLoginDialogCommand;RelayCommand
OpenLoginDialogCommand
{
{(openLoginDialogCommand == null)= new
RelayCommand(p => IsLogging = true, p => CurrentUser ==
null);openLoginDialogCommand;
}
}RelayCommand
closeLoginDialogCommand;RelayCommand CloseLoginDialogCommand
{
{(closeLoginDialogCommand == null)= new
RelayCommand(p => IsLogging = false, p => CurrentUser ==
null);closeLoginDialogCommand;
}
}RelayCommand
openManageWindowCommand;RelayCommand OpenManageWindowCommand
{
{(openManageWindowCommand == null)= new
RelayCommand(p => OpenManageWindow(), p => CurrentUser !=
null);openManageWindowCommand;
}
}void OpenManageWindow()
{window = new ManageWindow();viewModel = new
ManageViewModel();.IsAdmin = CurrentUser.Login ==
"admin";.DataContext = viewModel;.ShowDialog();= new EFRepository();=
Repository.Exhibits;
}void ReadMore(object p)
{exhibit = p as Exhibit;(exhibit != null)
{= exhibit;
}
}MainViewModel()
{
//CurrentUser =
Repository.Users.FirstOrDefault(u => u.Login == "admin");();
}
}
}
Класс
ManageBaseViewModel:
using ArchMuseumManager.DAL.Entities;ArchMuseumManager.Infrastructure;ArchMuseumManager.Models;Newtonsoft.Json;System;System.Collections.Generic;System.ComponentModel;System.Linq;System.Text;System.Threading.Tasks;System.Windows;System.Windows.Data;System.Windows.Input;ArchMuseumManager.ViewModels
{class
ManageBaseViewModel<T>:BaseViewModel where T: class, IEntity, new()
{DefaultMapper Mapper { get; set; } = new
DefaultMapper();T current;T Current
{{ return current; }{ current = value;
NotifyPropertyChanged(); }
}ICollectionView entities;EFRepository
repository;ICollectionView Entities
{
{(entities == null)
{=
CollectionViewSource.GetDefaultView(repository.GetDbSet<T>());.Filter =
Search_Filter;
}entities;
}{ entities = value;
NotifyPropertyChanged(); }
}string searchCriteria;string SearchCriteria
{{ return searchCriteria; }{ searchCriteria
= value; NotifyPropertyChanged(); Entities.Refresh(); }
}bool Search_Filter(object item)
{(item != null)
{name = (item as
IEntity).Name.ToString().ToLower();SearchCriteria != null ?
name.StartsWith(SearchCriteria.ToLower()) : true;
}false;
}ManageBaseViewModel(EFRepository
repository)
{.repository = repository;
}ICommand saveCommand;ICommand SaveCommand
{
{(saveCommand == null)
{= new RelayCommand(o => Save(), o =>
CanSave(o));
}saveCommand;
}
}ICommand closeFormsCommand;ICommand
CloseFormsCommand
{
{(closeFormsCommand == null)
{= new RelayCommand(o => { CloseForms();
});
}closeFormsCommand;
}
}ICommand addCommand;ICommand AddCommand
{
{(addCommand == null)
{= new RelayCommand(o => { Current = new
T() { ID = -1}; });
}addCommand;
}
}ICommand editCommand;ICommand EditCommand
{
{(editCommand == null)
{= new RelayCommand(o => Edit(o));
}editCommand;
}ICommand deleteCommand;ICommand
DeleteCommand
{
{(deleteCommand == null)
{= new RelayCommand(o => Delete(o));
}deleteCommand;
}
}void Delete(object o)
{entity = o as T;(entity != null)
{status = MessageBox.Show("Are you sure
want to remove this item?", "Removing",
MessageBoxButton.YesNo);(status == MessageBoxResult.No) return;(status ==
MessageBoxResult.Yes)
{exhibitToDelete =
repository.GetDbSet<T>().FirstOrDefault(op => op.ID ==
entity.ID);.Delete(exhibitToDelete);
}
}
}void Edit(object o)
{entity = o as T;(entity != null)
{entityCopy = new T();(entity, entityCopy);=
entityCopy;
}
}void Map(T source, T destination)
{type = typeof(T);properties =
type.GetProperties();(var property in properties)
{.SetValue(destination,
property.GetValue(source));
}
}void CloseForms()
{= null;
}bool CanSave(object o)
{Current != null &&
Current.IsValid();
}void Save()
{(Current.ID == -1)
{.Create(Current);.Refresh();
}
{entity =
repository.GetDbSet<T>().FirstOrDefault(o => o.ID ==
Current.ID);(Current, entity);
//Mapper.Map(Current,
entity);.Update(entity);
}= null;
}
}
}
Класс
ManageViewModel:
using
ArchMuseumManager.DAL.Entities;ArchMuseumManager.Infrastructure;System;System.Collections.Generic;System.Collections.ObjectModel;System.Linq;System.Text;System.Threading.Tasks;ArchMuseumManager.ViewModels
{class ManageViewModel : BaseViewModel
{
#region
CollectionsObservableCollection<Exhibit> Exhibits
{{ return Repository.Exhibits; }{
NotifyPropertyChanged(); }
}ObservableCollection<KindOfEra>
KindOfEras
{{ return Repository.KindOfEras; }{
NotifyPropertyChanged(); }
}ObservableCollection<ExType> ExTypes
{{ return Repository.ExTypes; }{
NotifyPropertyChanged(); }
}ObservableCollection<Era> Eras
{{ return Repository.Eras; }{
NotifyPropertyChanged(); }
}ObservableCollection<Archaeologist>
Archaeologists
{{ return Repository.Archaeologists; }{
NotifyPropertyChanged(); }
}ObservableCollection<University>
Universities
{{ return Repository.Universities; }{
NotifyPropertyChanged(); }
}ObservableCollection<Place> Places
{{ return Repository.Places; }{
NotifyPropertyChanged(); }
}
#endregionbool isAdmin;bool IsAdmin
{{ return isAdmin; }{ isAdmin = value;
NotifyPropertyChanged(); }
}
#region
ViewModelsManageBaseViewModel<Exhibit>
exhibitsViewModel;ManageBaseViewModel<Exhibit> ExhibitsViewModel
{{ return exhibitsViewModel; }{ exhibitsViewModel
= value; NotifyPropertyChanged(); }
}ManageBaseViewModel<KindOfEra>
kindOfErasViewModel;ManageBaseViewModel<KindOfEra> KindOfErasViewModel
{{ return kindOfErasViewModel; }{
kindOfErasViewModel = value; NotifyPropertyChanged(); }
}ManageBaseViewModel<Archaeologist>
archaeologistsViewModel;ManageBaseViewModel<Archaeologist>
ArchaeologistsViewModel
{{ return archaeologistsViewModel; }{
archaeologistsViewModel = value; NotifyPropertyChanged(); }
}ManageBaseViewModel<Era>
erasViewModel;ManageBaseViewModel<Era> ErasViewModel
{{ return erasViewModel; }{ erasViewModel =
value; NotifyPropertyChanged(); }
}ManageBaseViewModel<ExType>
exTypesViewModel;ManageBaseViewModel<ExType> ExTypesViewModel
{{ return exTypesViewModel; }{
exTypesViewModel = value; NotifyPropertyChanged(); }
}ManageBaseViewModel<Place>
placesViewModel;ManageBaseViewModel<Place> PlacesViewModel
{{ return placesViewModel; }{
placesViewModel = value; NotifyPropertyChanged(); }
}ManageBaseViewModel<University>
universitiesViewModel;ManageBaseViewModel<University>
UniversitiesViewModel
{{ return universitiesViewModel; }{
universitiesViewModel = value; NotifyPropertyChanged(); }
#endregionManageViewModel()
{= new
ManageBaseViewModel<Exhibit>(Repository);= new
ManageBaseViewModel<KindOfEra>(Repository);= new
ManageBaseViewModel<Archaeologist>(Repository);= new
ManageBaseViewModel<Era>(Repository);= new
ManageBaseViewModel<ExType>(Repository);= new
ManageBaseViewModel<Place>(Repository);= new
ManageBaseViewModel<University>(Repository);
}
}
}
Класс
Exhibit:
using
System;System.Collections.Generic;System.ComponentModel;System.Linq;System.Text;System.Threading.Tasks;ArchMuseumManager.DAL.Entities
{class Exhibit: ObservableObject, IEntity
{int id;int ID
{{ return id; }{ id = value;
NotifyPropertyChanged(); }
}string name;string Name
{{ return name; }{ name = value;
NotifyPropertyChanged(); }
}int ageID;int AgeID
{{ return ageID; }{ ageID = value;
NotifyPropertyChanged(); }
}int exTypeID;int ExTypeID
{{ return exTypeID; }{ exTypeID = value;
NotifyPropertyChanged(); }
}int placeID;int PlaceID
{{ return placeID; }{ placeID = value;
NotifyPropertyChanged(); }
}int archaeologistID;int ArchaeologistID
{{ return archaeologistID; }{
archaeologistID = value; NotifyPropertyChanged(); }
}Era age;virtual Era Age
{{ return age; }{ age = value;
NotifyPropertyChanged(); }
}Archaeologist archaeologist;virtual
Archaeologist Archaeologist
{{ return archaeologist; }{ archaeologist =
value; NotifyPropertyChanged(); }
}Place place;virtual Place Place
{{ return place; }{ place = value;
NotifyPropertyChanged(); }
}ExType exType;virtual ExType ExType
{{ return exType; }{ exType = value;
NotifyPropertyChanged(); }
}override string ToString()
{Name;
}bool IsValid()
{!string.IsNullOrWhiteSpace(Name)
&& Age != null
&& Archaeologist != null
&& Place != null
&& ExType != null;
}
}
}
Класс
ExType:
using
System;System.Collections.Generic;System.Linq;System.Text;System.Threading.Tasks;ArchMuseumManager.DAL.Entities
{class ExType : ObservableObject, IEntity
{int id;int ID
{{ return id; }{ id = value;
NotifyPropertyChanged(); }
}string name;string Name
{{ return name; }{ name = value;
NotifyPropertyChanged(); }
}override string ToString()
{Name;
}bool IsValid()
{!string.IsNullOrWhiteSpace(Name);
}
}
}
Реализованные транзакции:NOCOUNT ON;
-Состояние до начала транзакции
'До транзацкии' AS "Состояние"
,ExTypeID AS "Код"
,Name AS "Имя"
,@@SPID AS "Процесс"
,@@TRANCOUNT AS "Количество транзакций"
FROM ArchMuseum.DBO.Exhibits ORDER BY ExTypeID;
--Начало транзакцииTRANSACTION;
@@TRANCOUNT AS "Количество транзакций";
UPDATE ArchMuseum.DBO.ExhibitsExTypeID -= 0Name=N'Computer';
'До транзацкии' AS "Состояние"
,ExTypeID AS "Код"
,Name AS "Имя"
,@@SPID AS "Процесс"
,@@TRANCOUNT AS "Количество транзакций"
FROM ArchMuseum.DBO.Exhibits ORDER BY
ExTypeID;ArchMuseum.DBO.ExhibitsExTypeID += 0Name =N'Nature';
,ExTypeID AS "Код"
,Name AS "Имя"
,@@SPID AS "Процесс"
,@@TRANCOUNT AS "Количество транзакций"
FROM ArchMuseum.DBO.Exhibits ORDER BY ExTypeID;