МІНІСТЕРСТВООСВІТИ І НАУКИ УКРАЇНИ
МІЖНАРОДНИЙЕКОНОМІКО-ГУМАНІТАРНИЙ УНІВЕРСИТЕТ
імені академікаСтепана Дем’янчука
Факультеткібернетики
Кафедраінформаційних систем та обчислювальних методів
КУРСОВА РОБОТА
з дисципліни«Програмування»
на тему:
База даних«Телефонний довідник»
Рівне – 2010
1.Основи проектування реляційних баз даних
1.1 Інформаційні системи з базами даних
1.1.1 Інформація й дані
Першніж перейти до обговорення поняття інформаційної системи (ІС), спробуємоз'ясувати, що ж розуміється під словом інформація. Відповісти на це питання йпросто, і складно: слово "інформація" пов'язане із широким коломпонять.
Змістовнасторона поняття "інформація" дуже багатогранна й немає чіткихсемантичних меж. Однак завжди можна сказати, що можна з нею робити. Самевідповідь на це питання найчастіше й цікавить як системних аналітиків ірозроблювачів ІС, так і користувачів інформації (її основних споживачів).
З поглядуяк користувачів, так і розроблювачів ІС, в інформації є одна важливавластивість — вона є одиницею даних, яка підлягає обробці. Звичайно інформаціянадходить споживачеві саме у вигляді даних: таблиць, графіків, малюнків,фільмів, усних повідомлень, які фіксують у собі інформацію певної структури йтипу. Таким чином, дані виступають як засіб подання інформації у певній,фіксованій формі, придатній для обробки, зберігання й передачі. Хоча дуже частотерміни "інформація" й «дані» виступають як синоніми, вартопам'ятати про цю їхню істотну відмінність. Саме в даних інформація знаходитьінтерпретацію у конкретній ІС.
При згадуванніпро «форму» подання інформації варто сказати ще про одну,«людську» властивість інформації — її сприйняття різними категоріямилюдей. Дані можуть бути згруповані спільно у документ. Документ може мати абоне мати певну внутрішню структуру. Дані можуть бути відображені на екранідисплея комп'ютера. Документи можуть мати аудіо- або відеоформу. РозробляючиІС, ніколи не потрібно забувати, для кого вони (системи) створюються й хто будеїх використовувати. Форма подання інформації в ІС визначає також і категоріїкористувачів. ІС створюються для конкретних груп користувачів, тобто вони, якправило, проблемно-орієнтовані.
Інформаціяє дані, яким надається деякий зміст (інтерпретація) у конкретній ситуації урамках деякої системи понять. Інформація представляється за допомогою кодуванняданих і витягається шляхом їхнього декодування й інтерпретації.
У цьомувизначенні фіксується три основних перетворення інформації й даних у процесіїхньої обробки в ІС: інформація – дані, дані – дані, дані– інформація.
На рис.1.1 подані дві сторони визначення поняття інформації: функціональна й представницька.Перша загалом визначає коло дій над інформацією, а друга – результат виконанняцих дій.
/>
Рисунок1.1 – Зміст поняття "інформація"
1.1.2Інформаційні системи
Основноюметою створення ІС є задоволення інформаційних потреб користувачів шляхомнадання необхідної їм інформації на основі збережених даних. Потреба вінформації як такій не вичерпує поняття інформаційних потреб. Звичайно впоняття інформаційних потреб включають певні вимоги до якості інформаційногообслуговування й поводження системи в цілому (продуктивність, актуальність інадійність даних, орієнтація на користувача та ін.).
Під інформаційноюсистемою розуміється організаційна сукупність технічних засобів, технологічнихпроцесів і кадрів, що реалізують функції збору, обробки, зберігання, пошуку,видачі й передачі інформації.
Необхідністьпідвищення продуктивності праці у сфері інформаційної діяльності призводить дотого, що як зовнішні засоби зберігання й швидкий доступ до інформаціїнайчастіше використовуються засоби обчислювальної техніки (цифровий йаналоговий) на основі комп'ютерів. Сучасні ІС — складні комплекси апаратних іпрограмних засобів, технології й персоналу, які ще називають автоматизованимиінформаційними системами. Структурно ІС містять у собі апаратне (hardware),програмне (software), комунікаційне (netware), проміжного шару (middleware), лінгвістичней організаційно-технологічне забезпечення.
Апаратнезабезпечення ІС містить у собі широкий набір засобів обчислювальної техніки,передачі даних, а також цілий ряд спеціальних технічних пристроїв (пристроюграфічного відображення інформації, аудио- і відеопристрою, засобу мовногоуведення й т.д.). Апаратне забезпечення є основою будь-якої ІС.
Комунікаційне(мережне) забезпечення містить у собі комплекс апаратних мережних комунікацій іпрограмних засобів підтримки комунікацій в ІС. Воно має істотне значення пристворенні розподілених ІС й ІС на основі Інтернету.
Програмнезабезпечення ІС забезпечує реалізацію функцій введення даних, їх розміщення наносіях, модифікації даних, доступ до даних, підтримку функціонуванняустаткування. Програмне забезпечення можна розділити на системне (яке вінчаєпроцес вибору апаратно-програмного рішення, або платформи) і користувальницьке (якезастосовується для рішення завдань задоволення потреб користувача укомп'ютерному середовищі).
Лінгвістичнезабезпечення ІС призначене для рішення завдань формалізації змісту повнотекстовоїй спеціальної інформації для створення пошукового образу даних (профілю). Укласичному змісті звичайно воно включає процедури індексування текстів, їхнюкласифікацію й тематичну рубрикацію. Найчастіше ІС, що містятьскладно-структуровану інформацію, містять у собі тезауруси термінів і понять.Сюди можна віднести й створення процесорів спеціалізованих формальних мовкінцевих користувачів, наприклад мов для маніпулювання бухгалтерськоюінформацією й т.д. Найчастіше роботам по розробці лінгвістичного забезпечення ненадаєтьсяналежного значення. Подібні недогляди найчастіше ведуть до несприйняттякористувачами самої. Це відноситься в першу чергу до вузько спеціалізованих ІС.
У мірузростання складності й масштабів ІС важливу роль починає грати організаційно-технологічнезабезпечення, що з'єднує різнорідні компоненти (апаратури, програми й персонал)у єдину систему й забезпечує процедури її керування й функціонування. Недооцінкацієї складової ІС найчастіше призводить до зриву строків впровадження системи йвиводу її на виробничі потужності.
Нарис. 1.2 наведені функції ІС через її основні структурні компоненти.
/>
Рисунок1.2 – Визначення інформаційної системи
2. Предметна область БД та її моделі
2.1 Поняття предметної області
Основнимпризначенням ІС є оперативне забезпечення користувача інформацією про зовнішнійсвіт шляхом реалізації питально-відповідного відношення. Питально-відповіднівідношення дозволяють виділити для
/>
Рисунок1.6 — Основні типи моделей даних
ІСпевний її фрагмент — предметну область (ПО), — який буде втілений вавтоматизованій ІС. Інформація про зовнішній світ подається в ІС у формі даних,що обмежує можливості змістовної інтерпретації інформації й конкретизуєсемантику її подання в ІС. Сукупність цих виділених для ІС даних, зв'язків міжними й операцій над ними утворить інформаційну й функціональну моделі ПО, щоописують її стан із певною точністю. Інформаційна й функціональна моделі ПО євхідними даними для процесу проектування БД.
Сукупністьреалій (об'єктів) зовнішнього світу — об'єктів, про які можна задавати питання,- утворює об'єктне ядро ПО, яке має онтологічний статус. Не можна одержати в ІСвідповідь на питання про те, що їй невідомо. Термін «об'єкт» єпервинним поняттям. Синонімами терміна «об'єкт» є «реалія,сутність, річ». Сутність ПО є результатом абстрагування реального об'єкташляхом виділення й фіксації набору його властивостей. На рис. 1.7 наведенийодин із підходів до класифікації об'єктів ПО.
/>
Рисунок1.7 — Класифікації об'єктів ПО
Прикладамисутностей (з погляду ІС) або об'єктів (з погляду зовнішнього світу) є окремийстудент, група студентів, аудиторія, час занять, слова, числа, символи.Звичайно вважається, що бути об'єктом — це значить бути дискретним і помітним.
З об'єктамипов'язано дві проблеми: ідентифікація й адекватний опис. Для/> ідентифікаціївикористовують ім'я. Використовується тільки вказівна функція імені. Ім'я – це прямийспосіб ідентифікації об'єкта. До непрямих способів ідентифікації об'єктавідносять визначення об'єкта через його властивості (характеристики абоознаки).
2.2 Інформаційна модель ПО БД
Інформаційнамодель даних призначена для подання семантики ПО у термінах суб'єктивнихзасобів опису — сутностей, атрибутів, ідентифікаторів сутностей, супертипів,підтипів і т.д.
Інформаційнамодель ПО БД містить такі основні конструкції:
· діаграми«сутність-зв'язок» (Entity — Relationship Diagrams);
· визначеннясутностей;
· унікальніідентифікатори сутностей;
· визначенняатрибутів сутностей;
· відношенняміж сутностями;
· супертипий підтипи.
Елементиінформаційної моделі даних ПО є вхідними даними для вирішення завданняпроектування БД — створення логічної моделі даних.
Предметомінформаційної моделі є абстрагування об'єктів або явищ реального світу у рамкахПО, у результаті якого виявляються сутності (entity) ПО. Як правило, вони позначаютьсяіменником природної мови.
Сутністьописується за допомогою даних, іменованих властивостями або атрибутами (attributes)сутності. Як правило, атрибути є визначеннями у висловленні про сутності йпозначаються іменниками природної мови. Сутності вступають у зв'язки один зодним через свої атрибути. Кожна група атрибутів, що описуює один реальний проявсутності, являє собою екземпляр (instance) сутності. Іншими словами, екземплярисутності — це реалізації сутності, що відрізняються один від одного йдопускають однозначну ідентифікацію.
Одниміз основних комп'ютерних засобів розпізнавання сутностей у базі даних є присвоєннясутностям ідентифікаторів (Entity identifier). Часто ідентифікатор сутностіназивають ключем. Завдання вибору ідентифікатора сутності є суб'єктивнимзавданням. Оскільки сутність визначається набором своїх атрибутів, то длякожної сутності доцільно виділити таку підмножину атрибутів, що однозначноідентифікує дану сутність.
Завданнярозробника БД — забезпечити при збереженні екземплярів сутності у БД наявність укожного її нового екземпляра унікального дентифікатора.
Унікальнийідентифікатор сутності — це атрибут сутності, що дозволяє відрізняти однусутність від іншої. Якщо сутність має кілька унікальних ідентифікаторів, такзваних можливих ключів, то розробник повинен обрати первинний ключ сутності.
Розрізняютьоднозначні й багатозначні атрибути. Однозначними є атрибути, які в межахконкретного екземпляра сутності мають тільки одне значення. У протилежномувипадку вони вважаються багатозначними. Кожен атрибут сутності має домен(domain). Домен це вираз, який визначає значення, дозволені для даного атрибута.Іншими словами, домен — це область значень атрибута.
РозробникБД повинен проконтролювати, щоб в інформаційній моделі ПО для кожного атрибутасутностей був визначений домен.
Сутностіне існують окремо один від одного. Між ними є реальні відношення
(Relationship),і вони повинні бути відбиті в інформаційній моделі ПО. При виділенні відношеньакцент робиться на фіксацію зв'язків та їх характеристик. Відношення (зв'язок)являє собою з'єднання (взаємовідношення) між двома або більше сутностями. Кожензв'язок реалізується через значення атрибутів сутностей. Звичайно зв'язокпозначається дієсловом. Кожен зв'язок також повинен мати свій унікальнийідентифікатор зв'язку.
РозробникБД повинен проконтролювати, щоб зв'язок між сутностями здійснювався через точнозазначені атрибути, які будуть визначати унікальний ключ зв'язку. Вибір ключівсутностей — одне з найважливіших проектних рішень, що повинен бути зробитирозробник при переході від інформаційної моделі ПО до логічної моделі БД.
Зв'язкихарактеризуються ступенем зв'язку й класом приналежності сутності до зв'язку.Ступінь (потужність) зв'язку — це відношення числа сутностей, що беруть участьв утворенні зв'язку. Існують такі типи: «один-до-одного»,«один-до-множини», «множина-до- множини».
Типовоюформою документування інформаційної моделі ПО є діаграми«сутність-зв'язок» (ER-діаграми). ER-діаграма дозволяє графічноподати всі елементи інформаційної моделі згідно простим, інтуїтивно зрозумілим,але чітко визначеним правилам — нотаціям. Далі ми будемо користуватися умовнимипозначками, прийнятими в методології інформаційного проектування.
Сутністьна ER-діаграмі наводиться прямокутником з ім'ям у верхній частині. Будемовикористовувати англійські слова для іменування елементів моделі.
/>
Рисунок1.9 – Подання сутності Person (персонал) на ER-діаграмі з атрибутами йунікальним ідентифікатором сутності
Упрямокутнику перераховуються атрибути сутності, при цьому атрибути, що становлятьунікальний ідентифікатор сутності, підкреслюються.
Доменипризначаються аналітиками й фіксуються в спеціальному документі — словнику даних(Data Dictionary). На стадіях розроблення логічної й фізичної моделейреляційної БД домени уточнюються у сутностях на ER-діаграмі.
РозробникБД повинен ретельним образом вивчити домени кожного атрибута з погляду наможливість їх реалізації у СКБД.
/>
Рисунок1.10 – Візуалізація визначення доменів атрибутів на ER-діаграмі при створенніфізичної моделі реляційної БД
Відношення(зв'язок) сутностей на ER-діаграмі зображується лінією, що з'єднує ці сутності.Ступінь зв'язку зображується за допомогою символу «пташина лапка», щовказує на те, що у зв'язку бере участь багато (N) екземплярів сутності, іодинарною горизонтальною рисою, що вказує на те, що у зв'язку бере участь одинекземпляр сутності.
Відношеннячитається вздовж лінії або зліва направо, або справа наліво. На рис. 1.11наведене таке відношення: кожна спеціальність зі створення повинна бутизареєстрована за певною фізичною особою (персоною), фізична особа може матиодну або більше спеціальностей зі створення.
2.3 Функціональна модель ПО БД
Другимключовим моментом створення ІС з метою автоматизації інформаційних процесіворганізації є аналіз функціональної взаємодії об'єктів автоматизації. Аналітикинаводять результати у вигляді функціональної моделі ПО БД. Склад функціональноїмоделі істотно залежить від контексту конкретного ІТ-проекту і може бутипредставлений за допомогою досить широкого спектра документів у виглядітекстової й графічної інформації.
/>
Рисунок1.11 – Подання відношення між двома сутностями на ER-діаграмі
Функціональнамодель призначена для опису процесів обробки даних у рамках виділеної ПО зрізних точок зору.
Визначимофункціональну модель ПО БД як сукупність деяких моделей, призначених для опису процесівобробки інформації. Будемо називати ці моделі конструкціями функціональної моделі.Нижче наведений перелік основних конструкцій функціональної моделі, якінеобхідні для виконання проектування реляційних БД.
Моделіпроцесів:
· бізнес-модельпроцесів (ієрархія функцій системи);
· модельпотоку даних.
Моделістанів:
· модельжиттєвого циклу сутності;
· набірспецифікацій функцій системи (вимоги);
· описфункцій системи через сутності й атрибути;
· бізнес-правила,які реалізують функції.
Елементиінформаційної моделі ПО є вхідними даними для завдання створення
логічноїмоделі даних. Елементи функціональної моделі ПО є вхідними даними для завданняпроектування додатків БД і частково для завдання створення фізичної моделі БД.
2.4 Процес проектування БД
Значначастина проектів в області інформаційних технологій спрямована на розроблення йстворення ІС, у рамках яких здійснюється обробка даних різної складності.Практично у всіх таких проектах вирішується завдання проектування БД певноготипу.
В експлуатаціїБД повинна задовольняти набору вимог за рядом інтегрованих параметрів, такихяк:
функціональністьй адаптованість;
продуктивністьобробки транзакцій;
пропускназдатність;
часреакції
Такіпараметри іноді перебувають у протиріччі один до одного. Так, високі вимоги до функціональностіна даному конкретному устаткуванні можуть вступати у конфлікт із високимивимогами до продуктивності. Наприклад, звіти можуть генеруватися протягомдекількох годин і знизити в цей час реакції користувачів, що працюють із системоюв діалоговому режимі.
Такимчином, процес проектування БД полягає у досягненні компромісів міжфункціональними, інформаційними, апаратними, архітектурними й технологічнимивимогами до БД і будується на інформованому прийнятті рішень за структурою БД.
ПроектуванняБД — це пошук засобів задоволення функціональних вимог засобами наявноїкомп'ютерної технології з урахуванням заданих обмежень.
Якправило, ІТ-проекти зі створення БД містять у собі такі етапи:
1.Визначення стратегії побудови системи.
2.Аналіз вимог до БД.
3.Проектування БД.
4.Реалізація БД.
5.Тестування
6.Впровадження БД.
Етаппроектування БД вважається одним із самих складних етапів створення БД, який немає явно вираженого початку й закінчення. Порівняно з аналізом вимог до БД аборозробкою додатків, проектування БД, на думку багатьох провідних фахівців, єневдало структурованим завданням. Якщо всі етапи створення БД перекриваютьсяодин з одним у своїй послідовності, то етап проектування перекривається з усімаіншими етапами. Проектування починається з моменту прийняття стратегічнихрішень і триває на етапах реалізації й тестування.
Процеспроектування БД охоплює кілька основних сфер:
· проектуванняоб'єктів БД (таблиці, подання, індекси, тригери, збережені процедури, функції,пакети) для подання даних ПО в БД;
· проектуванняінтерфейсу взаємодії з БД (форми, звіти й т.д.), тобто проектування додатків,які будуть супроводжувати дані в БД і реалізовувати питально-відповіднівідношення на цих даних;
·проектування БД під конкретне обчислювальне середовище або інформаційнутехнологію (архітектура «клієнт-сервер», паралельні архітектури, розподіленеобчислювальне середовище);
· проектуванняБД під призначення системи (інтелектуальний аналіз даних, OLAP, OLTP і т.д.).
Типовабізнес-модель процесу проектування БД
Процеспроектування БД може бути поданий у вигляді моделі бізнес-процесів.Бізнес-модель процесу проектування дозволяє:
· відобразитисуб'єктивну думку розробника БД на процес проектування конкретної БД;
· врахуватиособливості ІТ-проекту, у рамках якого проектується БД;
· доситьшвидко скласти план проектування конкретної БД;
· прорахуватитривалість проектних робіт (створити тимчасову модель проектування).
Розглянемотипову бізнес-модель процесу проектування БД.
Нарис. 1.12 наведена контекстна діаграма процесу проектування БД.
Якбачимо з рисунка, на вхід процесу проектування БД подаються:
· інформаційнамодель ПО БД: діаграми «сутність-зв'язок» (ER-діаграми);
· функціональнамодель ПО БД: бізнес-модель процесів, діаграми потоку даних (DF- діаграми),діаграми станів, — діаграми життєвих циклів сутностей, специфікації на системи(вимоги), бізнес-правила;
· загальносистемнівимоги й обмеження;
· завданнязворотного впливу.
Навиході процесу проектування БД формуються такі результати:
· фізичнамодель БД, що може бути перетворена у скрипт для створення БД;
· фізичнаБД;
· специфікаціямодулів додатків БД;
· плантестування БД.
Продовжуючифункціональну декомпозицію процесу проектування БД, приходимо до діаграмидекомпозиції процесу проектування БД першого рівня, яка відбиває основнінайбільш великі професійні завдання (етапи) проектування БД (рис. 1.13).
/>
Рисунок1.12 – Контекстна діаграма процесу проектування БД
Такимизавданнями (етапами) є:
·збір й аналіз вхідних даних – це початковий етап проектування, на якомуздійснюється збір і контроль якості результатів аналізу ПО БД, готується планпроектування БД;
· створеннялогічної моделі БД – це етап, на якому на підставі інформаційної моделі
ПО БДстворюється логічна структура БД, незалежна від її реалізації;
· створенняфізичної моделі БД: внутрішня схема – це етап, на якому на підставі логічноїмоделі БД створюється фізична структура БД, залежна від її реалізації. На цьомуетапі виконується перетворення відношення логічної моделі реляційної БД укоманди створення об'єктів фізичної БД, у результаті чого створюється так званавнутрішня схема БД. Додатково може бути створена так звана зовнішня схема БД,останнє відбиває точку зору користувачів на дані в БД;
/>
Рисунок1.13 – Діаграма декомпозиція процесу проектування БД: перший рівень
·створення фізичної моделі БД: облік впливу транзакцій – це етап, на якомуаналізуються можливі транзакції системи, виконується при потребі денормалізаціявідношення для забезпечення більш високої продуктивності БД;
· створеннясерверного коду – це етап, на якому на підставі функціональної моделі ПО БДстворюється серверний код БД у вигляді тригерів, збережених процедур і пакетів.Ці модулі створюються розробником БД і виконуються сервером;
· проектуваннямодулів додатків БД – це етап, на якому створюються специфікації модулівдодатків, розробляються стратегії тестування БД і додатків, створюється плантестування додатків БД і готуються тестові дані;
· контрольякості проектування БД полягає в перевірці якості результатів проектування накожному його етапі;
· облікзавдань зворотного впливу полягає у настройці деяких транзакцій до БД ілокальному перепроектуванні БД відповідно до вимог, що надходять з інших етапівстворення БД.
Короткорозглянемо бізнес-моделі другого рівня.
Бізнес-модельпроцесу проектування БД: збір й аналіз вхідних даних
Нарис. 1.14 наведена діаграма декомпозиції процесу проектування БД другого рівня,що відбиває основні завдання етапу збору й аналізу вхідних даних.
Такимизавданнями є:
· збірдокументації з результатами аналізу ПО БД у вигляді діаграм, специфікацій і вимог;
· контрольякості результатів аналізу ПО БД;
· систематизаціявимог і специфікацій замовника до БД;
· підготовкаплану проектування БД.
/>
Рисунок.1.14 – Діаграма декомпозиції процесу проектування БД: збір й аналіз вхіднихданих
Уході контролю якості основними моментами діяльності є контроль ER-діаграм іконтроль діаграм функціональної моделі ПО. На підставі ER-діаграм створюєтьсялогічна модель реляційної БД; на підставі діаграм функціональної моделірозробляється серверний код і проектуються модулі додатків БД.
Систематизаціявимог замовника до БД виконується з метою їх адекватного розподілу по етапах проектуванняБД. Важливим результатом систематизації є висновок про достатність вимог іможливість реалізації БД. Аналіз вимог на можливість реалізації БД у рамкахконкретного ІТ-проекту є основою для ухвалення рішення менеджером проекту проможливості реалізації в цілому.
Дійснабізнес-модель процесу проектування БД являє собою досить простий типовий прикладбізнесу-моделі проектування. У загальному випадку зміст бізнес-моделіпроектування залежить від багатьох факторів: особистості менеджера й складу командипроекту, обсягу проекту, проектних ризиків і т.д.
Бізнес-модельпроцесу проектування реляційної БД: створення логічної моделі БД (рис. 1.15).Основною метою етапу створення логічної моделі БД є перетворення інформаційноїмоделі ПО БД у логічну модель реляційної БД. Створення логічної моделі БДприпускає рішення таких основних завдань і виконання операцій у рамках такихзавдань:
·нормалізація сутностей ПО: одержати список атрибутів сутності; визначитифункціональні залежності (ФЗ) у сутності; визначити детермінанти сутності;визначити можливі ключі відношення, зокрема, розглянувши унікальнийідентифікатор сутності; виконати нормалізацію сутності (перетворити сутність увідношення); для отриманого відношення призначити первинні ключі; сформуватисписок кандидатів на зовнішні ключі, якщо необхідно; сформувати бізнес-правилапідтримки цілісності сутності, якщо необхідно;
· нормалізаціявідношення логічної моделі БД;
· визначитиступінь зв'язку сутностей;
· визначитиклас приналежності сутності до зв'язку: нормалізувати відношення (дозволитизв'язку);
· призначитипервинні ключі єднальних відношень, виходячи з унікального ідентифікаторазв'язку й процедури міграції ключів при нормалізації; визначити атрибутиєднальних відношень, якщо необхідно; сформувати бізнес-правила підтримкицілісності зв'язків;
·перевірка правильності логічної моделі реляційної БД: перевірка відношень навідповідність нормальній формі Бойса-Кодда; перевірка відношень на властивостіз'єднання без втрат і збереження функціональних залежностей; запобігання втратиданих;
· шляхомміграції первинних ключів відношення й призначення зовнішніх ключів; перевірка навідсутність незамкнутих зв'язків; перевірка на відсутність одиночних відношень;
·формулювання частини вихідних даних для вирішення завдання керуванняпосилальною цілісністю;
· документуваннялогічної моделі реляційної БД;
· ухваленнярішення про можливість реалізації побудованої логічної моделі реляційної БД;
· ухваленнярішення про розроблення фізичної моделі реляційної БД.
Результатомпроектування логічної моделі БД є нормалізована схема відношень БД.
Відзначимо,що в ході виконання етапу створення логічної моделі БД можуть бути створенінові об'єкти БД, не передбачені в інформаційній моделі ПО, наприклад, єднальнасутність при нормалізації відношень зі ступенем зв'язку«множина-до-множини».
Поданізавдання становлять мінімально необхідний набір завдань, що дозволяють спроектуватилогічну модель БД, і можуть розглядатися як один з можливих способіворганізації робіт у цій області.
/>
Рисунок1.15 – Бізнес-модель процесу створення логічної моделі БД
Бізнес-модельетапу проектування — створення фізичної моделі реляційної БД
Основнамета вирішення цього завдання: перетворити логічну модель реляційної БД упослідовність команд SQL для створення об'єктів реляційної БД. Таким чином,розробник
БДвідображає відношення логічної моделі реляційної БД (сутності ПО, подані внормалізованій формі на ER-діаграмах) у таблиці й індекси реляційної БД.
Цезавдання включає виконання ряду обов'язкових послідовних процедур:
· створеннябазових таблиць. Вони представляють основні блоки зберігання даних і виводятьсяіз сутностей логічної моделі даних. При створенні кожної таблиці розробник повиненрозглянути й урахувати ряд факторів: визначити список колонок у таблиці(колонки виводяться з атрибутів сутності логічної моделі даних); визначити типиданих для кожної колонки (типи даних колонок або задані специфікацією доменуатрибута логічної моделі, або визначаються розробником самостійно); визначитиім'я таблиці (воно може бути виведене з імені сутності логічної моделі БД абозадано розробником самостійно. Бажано в цей момент визначити власника таблиці — користувача, що буде мати усі права доступу на таблицю, а також потенційних користувачівтаблиці); визначити ряд параметрів, пов'язаних із характером зберігання таблиціу фізичній БД; визначити обмеження на значення колонок, виходячи з рядубізнес-правил;
· створенняєднальних таблиць, необхідних для дозволу відношення «множина-до-множини», якщо вони мають місце в логічній моделі БД. У рамках ER-діаграмце відношення може бути вже дозволено. Тоді мова йтиме тільки про йогореалізації в командах SQL;
· ухвалитирішення щодо засобів підтримки посилальної цілісності в БД. Якщо буде вирішено підтримуватипосилальну цілісність на рівні команд SQL, то розробити специфікацію обмеженняпосилальної цілісності. Це завдання вирішується в чотири етапи: ідентифікуватипервинні ключі кожної таблиці; побудувати індекси первинного ключа; визначитизовнішні ключі в дочірніх таблицях, якщо необхідно; побудувати команди SQL, якіідентифікують зовнішні ключі в дочірніх таблицях і правила підтримки посилальноїцілісності; якщо необхідно, побудувати подання зовнішньої схеми БД.
Урезультаті вирішення даного завдання робиться важливий вивід про правильністьотриманої першої ітерації фізичної моделі БД, здійснюється документуванняфізичної моделі даних у вигляді скріпту, береться рішення про характерподальшої розробки фізичної моделі даних. Зі вказаної в попередніх розділахлекції зрозумілий такий алгоритм дій:
Створенняоб'єктів для зберігання даних:
Створеннятаблиць:
Ідентифікуваннятаблиці
Визначеннятипів даних колонок
Визначенняпервинного ключа
Додаванняобмежень
Створеннятаблиць для взаємозв'язку «множина-до-множини»
Створенняіндексів
Створенняподань
Створенняінших об'єктів БД
Перевіркакоректності створеної фізичної моделі
Нарис. 1.16 нижче подана модель бізнес-процесу першої ітерації фізичної моделіБД.
Головнамета етапу — створити послідовність команд SQL для створення об'єктівзберігання даних. Також можна створювати інші об'єкти, такі як синоніми, поданняй індекси. Можна ухвалити рішення щодо підтримки посилальної цілісності БДпрограмними механізмами СКБД і створити відповідний набір команд SQL.
Бізнес-модельетапу проектування — створення фізичної моделі реляційної БД: облік впливутранзакцій. Вирішуючи професійне завдання створення фізичної моделі даних — облік впливу транзакцій, — розробник реляційної прагне створити таку фізичнумодель даних, яка б, на його думку, давала найбільшу продуктивність обробкизапитів БД. На практиці, особливо при створенні й розробці нових БД, такезавдання навряд чи може бути вирішене повністю. Ясно, що для його вирішення необхідномати перелік всіх запитів до БД, їхній частоті й обсязі вибірок по кожному, щов принципі неможливо.
/>
Рисунок1.16 – Декомпозиція етапу проектування — створення першої ітерації фізичноїмоделі БД: внутрішня схема
Томурозробники БД на основі аналізу вихідної документації й опитувань потенційнихкористувачів намагаються систематизувати транзакції до БД, оцінитикардинальність таблиць у цілому й окремих колонках зокрема. На основі такихоцінок розробник БД намагається визначити критичні транзакції й налаштувати структуритаблиць, задіяних у таких транзакціях, на досягнення максимальноїпродуктивності. При цьому він висуває гіпотези про застосовність того або іншогозасобу підвищення продуктивності обробки запитів й перевіряє їх. Даліухвалюється рішення щодо застосування найбільш підходящого.
Слідрозуміти, що завдання забезпечення високої продуктивності БД — це завдання, якепостійно вирішує адміністратор БД у процесі її експлуатації. На цьому етапіпроектування БД розробник, у міру можливості, готовить успішне вирішення цьогозавдання. Цей етап є дуже відповідальним у фізичному проектуванні БД, томуварто дотримувати при вирішенні цього завдання розумного прагматизму ідокументувати свої рішення. Повинне діяти емпіричне правило: якщо розробник БДне має досить даних для надійного вирішення завдання підвищення продуктивностіБД, то рішення цього завдання повинне бути передане адміністраторові БД.
Нацьому етапі проектування фізичної моделі розробник реляційної БД:
· виходячиз вимог до характеру обробки даних, визначає тип додатка БД;
· занаявними вимогами й описами виконує систематизацію й опис за можливістю всіхтранзакцій;
· відштовхуючисьвід вихідної документації, визначає можливі розміри таблиць, а якщо ценеможливо, робить припущення про їхній можливий розмір;
·виходячи з фактичних розмірів таблиць і вимог до продуктивності виконаннятранзакцій, визначає критичні транзакції;
· длякожної критичної транзакції необхідно оцінити кардинальність кожної колонки,задіяної у транзакції й, за можливістю, кардинальність вибірки;
· далі,розглядаючи в першу чергу критичні транзакції й таблиці, які в них берутьучасть, розробник БД приймає суб'єктивні рішення по зміні структури таблиць внутрішньоїсхеми БД, виходячи з тих механізмів, які йому надає конкретна СКБД;
· по завершеннізміни структур таблиць розробник БД документує ці зміни, приводячиобґрунтування своїх рішень для адміністратора БД.
У результатірозробник БД створює фізичну модель БД, що враховує характер обробки даних уБД, виражений через облік впливу транзакцій.
Побудовабізнес-моделі етапу проектування фізичної моделі реляційної БД: облік впливутранзакцій проходить у кілька таких етапів (рис. 1.17):
Визначенняосновного типу додатка БД;
Документуванняй опистранзакцій;
Визначеннякритичних транзакцій;
Длякожної критичної транзакції:
Визначеннятаблиць транзакції
Визначенняспособу підвищення продуктивності
Денормализаціятаблиці;
Розбиттятаблиці;
Секціонуваннятаблиці;
Кластерізаціятаблиці;
Побудовадодаткових індексів;
Змінаструктури внутрішньої схеми БД;
Документуваннязмін;
Длякожної таблиці БД Вибір індексів:
Визначеннятранзакцій таблиці;
Визначеннякардинальності таблиць;
Визначеннякардинальності колонок;
Визначенняіндексів;
Змінавнутрішньої схеми;
Короткийрозгляд завдань створення серверного коду й підготовки скріпту Професійнезавдання проектування БД — розроблення серверного коду БД — виникають, якправило, в обчислювальному середовищі з багатьма користувачами. У цих системахкористувачі спільно використовують обчислювальні ресурси, зокрема ресурси дисковоїпам'яті й оперативної пам'яті процесора. Обчислювальні ресурси можуть бутисконцентровані в одному місці (централізовані обчислення) або бути розосередженимив різних вузлах, об'єднаних у комп'ютерну мережу (розподілені обчислення). СКБДу кожному разі покликана координувати й здійснювати доступ користувачів до баз данихта їхніх об'єктів.
/>
Рисунок1.17 – Декомпозиція етапу проектування — створення першої ітерації фізичноїмоделі БД: внутрішня схема
Більшістьсучасних СКБД підтримують концепцію клієнт-серверної технології длярозподілених обчислень. Це означає, що існують концентратори обчислень (названісерверами), на яких виконується найбільший обсяг обчислень із даними (сервериБД), і машини користувачів (клієнти), на яких виконуються додатки користувачів.Додатки формують запити у формі команд SQL до БД, відправляють їхнім серверамБД, одержують запитувані дані й обробляють їх.
3. Постановка завдання
Написатибазу даних (БД), що дозволяє накопичувати інформацію, а саме — телефоннийдовідник Програма повинна містити утримувати основні функції: додавання добавлятизапису, видалення віддалення запису, редагування запису, пошук. Додатковорозробити ступені захисту до БД.
4.Загальний опис програми
Програмнийпродукт написаний в середовищі об'єктно орієнтованого програмування MicrosoftVisual C# 2008 Exspress Edition.
Самапрограма містить 3 основні форми:
MainForm.cs– головна форма програми. Зосереджено основний інтерфейс.
ItemForm.cs– форма вводу інформації про абонента записної книжки.
UserForm.cs– форма створення користувача БД(телефонного довідника). Інтерфейс захисту БД.
Вихіднийкод програми розміщений в додатках.
Програмнийпродукт дає можливість запису та зберігання інформації про абонента, а самейого ім’я, номер мобільного та домашнього телефону, його електронну та фізичнуадресу, а також дату рейестрації його в БД. Відповідно, ми можемо редагуватизаписи в телефонному довілнику, — видаляти та змінювати вміст, а також задаватипошук необхідного.
Такожми можемо заходити в БД під своїм логіном та паролем.
Висновок
Врамках даної курсової роботи було поставлено завдання розробити базу даних(БД), що дозволяє зберігати інформацію про абонентів(Ім’я, телефон, мобільний,адреса, email, дата рейестрації). База даних містить утримувати основні функції:додавання добавляти запису, видалення віддалення запису, редагування запису,пошук заданої інформації.
Булопроведено ознайомлення з відповідною літературою по дисципліні «бази даних».Після цього була написана програма в середовищі об’єктно-орієнтованогопрограмування Microsoft Visual C# 2008 Express Edition.
Програмнийпродукт містить простий та інтуїтивно-зрозумілий інтерфейс. Після тестуванняпрограми можна зробити висновок, що вона коректно працює в середовищі MicrosoftWindows XP SP3. Вона повністю відповідає вимогам, поставлених в даній курсовійроботі, належить до категорії Open Source, тобто має можливість бути змінена,вдосконалена за бажанням в подальшій розробці.
Додаток 1: Вихідний код програми
Головна форма:
using System;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
usingSystem.Windows.Forms;
using Phonebook.Classes;
using System.Diagnostics;
using System.IO;
using System.Xml.Linq;
usingSystem.Globalization;
namespace Phonebook
{
public partial classMainForm: Form
{
float FontSize = 10.0f;
public MainForm()
{
InitializeComponent();
}
#region Buttons
voidbuttonNew_Click(object sender, EventArgs e)
{
try
{
ItemForm newForm = newItemForm(true, false);
newForm.Font = newFont(this.Font.Name, this.FontSize, this.Font.Style, this.Font.Unit,this.Font.GdiCharSet, this.Font.GdiVerticalFont);
newForm.Text =«Додати новий запис»;
newForm.lableRegDate.Text= christianToolStripMenuItem.Checked? DateTime.Now.ToString():ConvertToPersianDate(DateTime.Now.ToString());
newForm.ShowDialog();
LoadPhoneBookItems();
int contactsNumbers =Variables.xDocument.Descendants(«Item»).Where(q =>q.Attribute(«UserID»).Value == Variables.CurrentUserID).Count();
this.Text =Variables.Caption + Variables.CurrentUserName + ": " +contactsNumbers.ToString() + " Contacts";
}
catch (Exception ex)
{
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
voidbuttonClearSearchTextBox_Click(object sender, EventArgs e)
{
textBoxSearch.Text ="";
LoadPhoneBookItems();
}
voidbuttonEdit_Click(object sender, EventArgs e)
{
try
{
if(listView1.SelectedItems.Count
string id =listView1.SelectedItems[0].Name.Replace(«Item», "");
var item = (from q inVariables.xDocument.Descendants(«Item»)
whereq.Attribute(«UserID»).Value == Variables.CurrentUserID &&q.Attribute(«ID»).Value == id
select q).First();
if (item == null) return;
ItemForm editForm = newItemForm(false, true);
editForm.Font = newFont(this.Font.Name, this.FontSize, this.Font.Style, this.Font.Unit,this.Font.GdiCharSet, this.Font.GdiVerticalFont);
editForm.Text =«Edit Item»;
editForm.textBoxAddress.Text= item.Attribute(«Address»).Value;
editForm.textBoxEMail.Text= item.Attribute(«Email»).Value;
editForm.textBoxMobile.Text= item.Attribute(«Mobile»).Value;
editForm.textBoxName.Text= item.Attribute(«Name»).Value;
editForm.textBoxPhone.Text= item.Attribute(«Phone»).Value;
editForm.lableRegDate.Text= christianToolStripMenuItem.Checked?item.Attribute(«RegDate»).Value: ConvertToPersianDate(item.Attribute(«RegDate»).Value);
editForm.ItemID = id;
editForm.ShowDialog();
LoadPhoneBookItems();
}
catch (Exception ex)
{
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
void buttonDelete_Click(objectsender, EventArgs e)
{
try
{
if(listView1.SelectedItems.Count
if(MessageBox.Show(«Ви впевнені, що хочете видалити запис, його потім невідновиш?», «Попередження», MessageBoxButtons.YesNo,MessageBoxIcon.Warning) == DialogResult.No) return;
string id =listView1.SelectedItems[0].Name.Replace(«Item», "");
var item = (from q inVariables.xDocument.Descendants(«Item»)
whereq.Attribute(«UserID»).Value == Variables.CurrentUserID &&q.Attribute(«ID»).Value == id
select q).First();
item.Remove();
TripleDES.EncryptToFile(Variables.xDocument.ToString(SaveOptions.DisableFormatting),Variables.DBFile, TripleDES.ByteKey, TripleDES.IV);
//Variables.xDocument.Save(«debug.xml»);
LoadPhoneBookItems();
int contactsNumbers =Variables.xDocument.Descendants(«Item»).Where(q =>q.Attribute(«UserID»).Value == Variables.CurrentUserID).Count();
this.Text =Variables.Caption + Variables.CurrentUserName + ": " +contactsNumbers.ToString() + " Contacts";
}
catch (Exception ex)
{
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
#endregion
#region Menu Strip Events
#region Settings
voidrightToLeftToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
rightToLeftToolStripMenuItem.Checked= true;
leftToRightToolStripMenuItem.Checked= false;
textBoxSearch.RightToLeft= RightToLeft.Yes;
listView1.RightToLeft =RightToLeft.Yes;
var query = (from q inVariables.xDocument.Descendants(«Setting»)
whereq.Attribute(«UserID»).Value == Variables.CurrentUserID
select q).First();
query.Attribute(«RightToLeft»).Value= «Yes»;
TripleDES.EncryptToFile(Variables.xDocument.ToString(SaveOptions.DisableFormatting),Variables.DBFile, TripleDES.ByteKey, TripleDES.IV);
//Variables.xDocument.Save(«debug.xml»);
}
catch { }
}
voidleftToRightToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
leftToRightToolStripMenuItem.Checked= true;
rightToLeftToolStripMenuItem.Checked= false;
textBoxSearch.RightToLeft= RightToLeft.No;
listView1.RightToLeft =RightToLeft.No;
var query = (from q inVariables.xDocument.Descendants(«Setting»)
whereq.Attribute(«UserID»).Value == Variables.CurrentUserID
select q).First();
query.Attribute(«RightToLeft»).Value= «NO»;
TripleDES.EncryptToFile(Variables.xDocument.ToString(SaveOptions.DisableFormatting),Variables.DBFile, TripleDES.ByteKey, TripleDES.IV);
}
catch { }
}
voidtoolStripMenuItemFontSize_Click(object sender, EventArgs e)
{
try
{
toolStripMenuItemFontSize8.Checked= toolStripMenuItemFontSize10.Checked = toolStripMenuItemFontSize12.Checked =toolStripMenuItemFontSize14.Checked = toolStripMenuItemFontSize16.Checked =toolStripMenuItemFontSize18.Checked = false;
ToolStripMenuItem menuItem= sender as ToolStripMenuItem;
menuItem.Checked = true;
this.FontSize =float.Parse(menuItem.Text.Trim());
if (this.Font.Size!=this.FontSize)
{
this.Font = newFont(this.Font.Name, this.FontSize, this.Font.Style, this.Font.Unit,this.Font.GdiCharSet, this.Font.GdiVerticalFont);
var query = (from q inVariables.xDocument.Descendants(«Setting»)
whereq.Attribute(«UserID»).Value == Variables.CurrentUserID
select q).First();
query.Attribute(«FontSize»).Value= this.FontSize.ToString();
TripleDES.EncryptToFile(Variables.xDocument.ToString(SaveOptions.DisableFormatting),Variables.DBFile, TripleDES.ByteKey, TripleDES.IV);
//Variables.xDocument.Save(«debug.xml»);
}
}
catch { }
}
voidchristianToolStripMenuItem_Click(object sender, EventArgs e)
{
christianToolStripMenuItem.Checked= true;
persianToolStripMenuItem.Checked= false;
var query = (from q inVariables.xDocument.Descendants(«Setting»)
whereq.Attribute(«UserID»).Value == Variables.CurrentUserID
select q).First();
query.Attribute(«Dates»).Value= «Christian»;
TripleDES.EncryptToFile(Variables.xDocument.ToString(SaveOptions.DisableFormatting),Variables.DBFile, TripleDES.ByteKey, TripleDES.IV);
//Variables.xDocument.Save(«debug.xml»);
}
voidpersianToolStripMenuItem_Click(object sender, EventArgs e)
{
christianToolStripMenuItem.Checked= false;
persianToolStripMenuItem.Checked= true;
var query = (from q inVariables.xDocument.Descendants(«Setting»)
whereq.Attribute(«UserID»).Value == Variables.CurrentUserID
select q).First();
query.Attribute(«Dates»).Value= «Persian»;
TripleDES.EncryptToFile(Variables.xDocument.ToString(SaveOptions.DisableFormatting),Variables.DBFile, TripleDES.ByteKey, TripleDES.IV);
//Variables.xDocument.Save(«debug.xml»);
}
#endregion
voidexitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
voidnewUserToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
UserForm newUserForm =new UserForm(true, false, false);
newUserForm.Font = newFont(this.Font.Name, this.FontSize, this.Font.Style, this.Font.Unit, this.Font.GdiCharSet,this.Font.GdiVerticalFont);
newUserForm.ShowDialog();
ApplySettings();
LoadPhoneBookItems();
if(Variables.CurrentUserName!= "" && Variables.CurrentUserID!="")
{
int contactsNumbers =Variables.xDocument.Descendants(«Item»).Where(q =>q.Attribute(«UserID»).Value == Variables.CurrentUserID).Count();
this.Text =Variables.Caption + Variables.CurrentUserName + ": " +contactsNumbers.ToString() + " Contacts";
DisableEnableControls(true);
}
else
DisableEnableControls(false);
}
catch (Exception ex)
{
DisableEnableControls(false);
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
voidchangeUserToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
UserForm userForm = newUserForm(false, true, false);
userForm.Font = newFont(this.Font.Name, this.FontSize, this.Font.Style, this.Font.Unit,this.Font.GdiCharSet, this.Font.GdiVerticalFont);
userForm.ShowDialog();
ApplySettings();
LoadPhoneBookItems();
if(Variables.CurrentUserName!= "" && Variables.CurrentUserID!="")
{
int contactsNumbers =Variables.xDocument.Descendants(«Item»).Where(q =>q.Attribute(«UserID»).Value == Variables.CurrentUserID).Count();
this.Text =Variables.Caption + Variables.CurrentUserName + ": " +contactsNumbers.ToString() + " Contacts";
DisableEnableControls(true);
}
else
DisableEnableControls(false);
}
catch (Exception ex)
{
DisableEnableControls(false);
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
voidchangeInfoToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
UserForm changeInfoForm =new UserForm(false, false, true);
changeInfoForm.Font = newFont(this.Font.Name, this.FontSize, this.Font.Style, this.Font.Unit,this.Font.GdiCharSet, this.Font.GdiVerticalFont);
var userElement = from qin Variables.xDocument.Descendants(«User»)
whereq.Attribute(«ID»).Value == Variables.CurrentUserID
select q;
string username =userElement.First().Attribute(«UserName»).Value;
string email =userElement.First().Attribute(«Email»).Value;
changeInfoForm.textBoxUsername.Text= username;
changeInfoForm.textBoxEmail.Text= email;
changeInfoForm.ShowDialog();
if(Variables.CurrentUserName!= "" && Variables.CurrentUserID!="")
{
int contactsNumbers =Variables.xDocument.Descendants(«Item»).Where(q =>q.Attribute(«UserID»).Value == Variables.CurrentUserID).Count();
this.Text =Variables.Caption + Variables.CurrentUserName + ": " +contactsNumbers.ToString() + " Contacts";
DisableEnableControls(true);
}
else
DisableEnableControls(false);
}
catch (Exception ex)
{
DisableEnableControls(false);
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
voidaboutProgrammerToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(«vkontakte.ru/id2688556»);
}
#endregion
void LoadPhoneBookItems()
{
try
{
listView1.Items.Clear();
var items = from q inVariables.xDocument.Descendants(«Item»)
whereq.Attribute(«UserID»).Value == Variables.CurrentUserID
select q;
if (items.Count()
return;
foreach (var item initems)
{
ListViewItemlistViewItems;
if(christianToolStripMenuItem.Checked)
listViewItems = newListViewItem(new string[]
{item.Attribute(«Name»).Value,
item.Attribute(«Phone»).Value,
item.Attribute(«Mobile»).Value,
item.Attribute(«Email»).Value,
item.Attribute(«Address»).Value,
item.Attribute(«RegDate»).Value});
else
listViewItems = newListViewItem(new string[]
{item.Attribute(«Name»).Value,
item.Attribute(«Phone»).Value,
item.Attribute(«Mobile»).Value,
item.Attribute(«Email»).Value,
item.Attribute(«Address»).Value,
ConvertToPersianDate(item.Attribute(«RegDate»).Value)});
listViewItems.Name =«Item» + item.Attribute(«ID»).Value;
listView1.Items.Add(listViewItems);
}
}
catch (Exception ex)
{
DisableEnableControls(false);
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
void ApplySettings()
{
try
{
if (Variables.xDocument== null)
{
DisableEnableControls(false);
return;
}
var Settings = (from q inVariables.xDocument.Descendants(«Setting»)
whereq.Attribute(«UserID»).Value == Variables.CurrentUserID
select q).First();
if(Settings.Attribute(«RightToLeft»).Value == «Yes»)
rightToLeftToolStripMenuItem_Click(null,null);
else
leftToRightToolStripMenuItem_Click(null,null);
if (Settings.Attribute(«Dates»).Value== «Persian»)
{
persianToolStripMenuItem.Checked= true;
christianToolStripMenuItem.Checked= false;
}
else
{
persianToolStripMenuItem.Checked= false;
christianToolStripMenuItem.Checked= true;
}
this.FontSize =float.Parse(Settings.Attribute(«FontSize»).Value);
this.Font = newFont(this.Font.Name, this.FontSize, this.Font.Style, this.Font.Unit,this.Font.GdiCharSet, this.Font.GdiVerticalFont);
if (this.FontSize == 8)
{
toolStripMenuItemFontSize8.Checked= true;
toolStripMenuItemFontSize10.Checked= false;
toolStripMenuItemFontSize12.Checked= false;
toolStripMenuItemFontSize14.Checked= false;
toolStripMenuItemFontSize16.Checked= false;
toolStripMenuItemFontSize18.Checked= false;
}
else if (this.FontSize ==10)
{
toolStripMenuItemFontSize8.Checked= false;
toolStripMenuItemFontSize10.Checked= true;
toolStripMenuItemFontSize12.Checked= false;
toolStripMenuItemFontSize14.Checked= false;
toolStripMenuItemFontSize16.Checked= false;
toolStripMenuItemFontSize18.Checked= false;
}
else if (this.FontSize ==12)
{
toolStripMenuItemFontSize8.Checked= false;
toolStripMenuItemFontSize10.Checked= false;
toolStripMenuItemFontSize12.Checked= true;
toolStripMenuItemFontSize14.Checked= false;
toolStripMenuItemFontSize16.Checked= false;
toolStripMenuItemFontSize18.Checked= false;
}
else if (this.FontSize ==14)
{
toolStripMenuItemFontSize8.Checked= false;
toolStripMenuItemFontSize10.Checked= false;
toolStripMenuItemFontSize12.Checked= false;
toolStripMenuItemFontSize14.Checked= true;
toolStripMenuItemFontSize16.Checked= false;
toolStripMenuItemFontSize18.Checked= false;
}
else if (this.FontSize ==16)
{
toolStripMenuItemFontSize8.Checked= false;
toolStripMenuItemFontSize10.Checked= false;
toolStripMenuItemFontSize12.Checked= false;
toolStripMenuItemFontSize14.Checked= false;
toolStripMenuItemFontSize16.Checked= true;
toolStripMenuItemFontSize18.Checked= false;
}
else if (this.FontSize ==18)
{
toolStripMenuItemFontSize8.Checked= false;
toolStripMenuItemFontSize10.Checked= false;
toolStripMenuItemFontSize12.Checked= false;
toolStripMenuItemFontSize14.Checked= false;
toolStripMenuItemFontSize16.Checked= false;
toolStripMenuItemFontSize18.Checked= true;
}
}
catch (Exception ex)
{
DisableEnableControls(false);
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
voidMainForm_Shown(object sender, EventArgs e)
{
try
{
if(!File.Exists(Variables.DBFile))
{
newUserToolStripMenuItem_Click(null,null);
return;
}
Variables.xDocument =XDocument.Parse(TripleDES.DecryptFromFile(Variables.DBFile, TripleDES.ByteKey,TripleDES.IV));
var users = from q inVariables.xDocument.Descendants(«User»)
select q;
if (users.Count()
{
newUserToolStripMenuItem_Click(null,null);
return;
}
else//More than one userexist
{
changeUserToolStripMenuItem_Click(null,null);
}
}
catch (Exception ex)
{
DisableEnableControls(false);
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
try
{
File.Delete(Variables.DBFile);
}
catch
{
MessageBox.Show(«Будь-ласка,видаліть файл бази даних», «Критична помилка»,MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
voidDisableEnableControls(bool enable)
{
if (enable)
{
changeInfoToolStripMenuItem.Enabled= settingsToolStripMenuItem.Enabled = true;
textBoxSearch.Enabled =listView1.Enabled = true;
buttonNew.Enabled = true;
}
else
{
changeInfoToolStripMenuItem.Enabled= settingsToolStripMenuItem.Enabled = false;
textBoxSearch.Enabled =listView1.Enabled = false;
buttonNew.Enabled =false;
}
}
stringConvertToPersianDate(string stringDate)
{
try
{
DateTime dateTime =DateTime.Parse(stringDate);
PersianCalendarpersianCalendar = new PersianCalendar();
var str =persianCalendar.GetYear(dateTime).ToString() + " / " +
persianCalendar.GetMonth(dateTime).ToString()+ " / " +
persianCalendar.GetDayOfMonth(dateTime).ToString()+ " " +
persianCalendar.GetHour(dateTime).ToString()+ ":" +
persianCalendar.GetMinute(dateTime).ToString()+ ":" +
persianCalendar.GetSecond(dateTime).ToString();
return str;
}
catch (Exception ex)
{
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
return "";
}
}
#region listview
voidtextBoxSearch_TextChanged(object sender, EventArgs e)
{
try
{
if(textBoxSearch.Text.Trim() == "")
{
LoadPhoneBookItems();
return;
}
listView1.Items.Clear();
var query = from q inVariables.xDocument.Descendants(«Item»)
whereq.Attribute(«UserID»).Value == Variables.CurrentUserID &&
(q.Attribute(«Name»).Value.ToLower().Contains(textBoxSearch.Text.Trim().ToLower())
q.Attribute(«Phone»).Value.ToLower().Contains(textBoxSearch.Text.Trim().ToLower())
q.Attribute(«Mobile»).Value.ToLower().Contains(textBoxSearch.Text.Trim().ToLower())
q.Attribute(«Email»).Value.ToLower().Contains(textBoxSearch.Text.Trim().ToLower())
q.Attribute(«Address»).Value.ToLower().Contains(textBoxSearch.Text.Trim().ToLower()))
select q;
if (query.Count()
foreach (var item inquery)
{
ListViewItemlistViewItems = new ListViewItem(new string[]
{item.Attribute(«Name»).Value,
item.Attribute(«Phone»).Value,
item.Attribute(«Mobile»).Value,
item.Attribute(«Email»).Value,
item.Attribute(«Address»).Value,
item.Attribute(«RegDate»).Value});
listViewItems.Name =«Item» + item.Attribute(«ID»).Value;
listView1.Items.Add(listViewItems);
}
}
catch (Exception ex)
{
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
voidlistView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
//var item =listView1.GetItemAt(e.X, e.Y);
buttonEdit_Click(null,null);
}
#endregion
}
}
Форма введення запису про абонентів:
using System;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
usingSystem.Windows.Forms;
using System.Diagnostics;
using Phonebook.Classes;
using System.Xml.Linq;
using System.IO;
usingSystem.Drawing.Imaging;
namespace Phonebook
{
public partial classItemForm: Form
{
public string ItemID ="";
bool NewItem = false;
bool EditItem = false;
public ItemForm(boolnewItem, bool editItem)
{
InitializeComponent();
this.tableLayoutPanel1.CellPaint+= new TableLayoutCellPaintEventHandler(tableLayoutPanel1_CellPaint);
//////////////////////
this.NewItem = newItem;
this.EditItem = editItem;
if (NewItem)
this.Text = «Додатиновий запис»;
else if (EditItem)
this.Text =«Редагувати запис»;
}
voidtableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
try
{
if (e.Row % 2 == 0)
{
Graphics g = e.Graphics;
Rectangle r =e.CellBounds;
g.FillRectangle(newSolidBrush(Color.FromArgb(225, 225, 225)), r);
}
}
catch (Exception ex)
{
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
private voidbuttonSubmit_Click(object sender, EventArgs e)
{
try
{
errorProvider1.Clear();
#region add new item
if (NewItem)
{
if(textBoxName.Text.Trim() == "")
{
errorProvider1.SetError(textBoxName,«Будь-ласка, введіть ім'я»);
return;
}
int maxID = 0;
try
{
maxID = (from q inVariables.xDocument.Descendants(«Item»)
whereq.Attribute(«UserID»).Value == Variables.CurrentUserID
select(int)q.Attribute(«ID»)).Max();
}
catch { }
maxID++;
XElement newItem = newXElement(«Item», new XAttribute(«ID», maxID),
newXAttribute(«UserID», Variables.CurrentUserID),
newXAttribute(«Name», textBoxName.Text.Trim()),
newXAttribute(«Mobile», textBoxMobile.Text.Trim()),
newXAttribute(«Phone», textBoxPhone.Text.Trim()),
newXAttribute(«Email», textBoxEMail.Text.Trim()),
newXAttribute(«Address», textBoxAddress.Text.Trim()),
newXAttribute(«RegDate», DateTime.Now.ToString()));
var ItemsElement = (fromq in Variables.xDocument.Descendants(«Items»)
select q).First();
ItemsElement.Add(newItem);
}
#endregion
#region edit item
else if (EditItem)
{
if(textBoxName.Text.Trim() == "")
{
errorProvider1.SetError(textBoxName,«Будь-ласка, введіть ім'я»);
return;
}
var theItem = (from q inVariables.xDocument.Descendants(«Item»)
whereq.Attribute(«ID»).Value == this.ItemID
select q).First();
theItem.Attribute(«Name»).Value= textBoxName.Text.Trim();
theItem.Attribute(«Mobile»).Value= textBoxMobile.Text.Trim();
theItem.Attribute(«Phone»).Value= textBoxPhone.Text.Trim();
theItem.Attribute(«Email»).Value= textBoxEMail.Text.Trim();
theItem.Attribute(«Address»).Value= textBoxAddress.Text.Trim();
}
#endregion
TripleDES.EncryptToFile(Variables.xDocument.ToString(SaveOptions.DisableFormatting),Variables.DBFile, TripleDES.ByteKey, TripleDES.IV);
//Variables.xDocument.Save(«debug.xml»);
this.Close();
}
catch (Exception ex)
{
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
#region
Image ResizeImage(ImageFullsizeImage, int NewWidth, int MaxHeight, bool OnlyResizeIfWider)
{
// Prevent using imagesinternal thumbnail
FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
if (OnlyResizeIfWider)
{
if (FullsizeImage.Width
{
NewWidth =FullsizeImage.Width;
}
}
int NewHeight =FullsizeImage.Height * NewWidth / FullsizeImage.Width;
if (NewHeight >MaxHeight)
{
// Resize with heightinstead
NewWidth =FullsizeImage.Width * MaxHeight / FullsizeImage.Height;
NewHeight = MaxHeight;
}
System.Drawing.ImageNewImage = FullsizeImage.GetThumbnailImage(NewWidth, NewHeight, null,IntPtr.Zero);
// Clear handle tooriginal file so that we can overwrite it if necessary
FullsizeImage.Dispose();
// Save resized picture
return NewImage;
}
stringImageToBase64String(Image image, ImageFormat format)
{
MemoryStream memory = newMemoryStream();
image.Save(memory,format);
string base64 =Convert.ToBase64String(memory.ToArray());
memory.Close();
return base64;
}
ImageImageFromBase64String(string base64)
{
MemoryStream memory = newMemoryStream(Convert.FromBase64String(base64));
Image result =Image.FromStream(memory);
memory.Close();
return result;
}
#endregion
}
}
Форма користувача:
using System;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml.Linq;
using Phonebook.Classes;
using System.Diagnostics;
using System.Net.Mail;
using System.Net;
namespace Phonebook
{
public partial classUserForm: Form
{
bool NewUser = false;
bool ChangeUser = false;
bool ChangeInfo = false;
public UserForm(boolnewUser, bool changeUser, bool changeInfo)
{
InitializeComponent();
/////////////////////
this.NewUser = newUser;
this.ChangeInfo =changeInfo;
this.ChangeUser =changeUser;
if (NewUser)
{
this.Text = «Додатинового користувача»;
labelPass1.Text =«Пароль:»;
labelPass2.Text =«Підтвердити пароль:»;
checkBoxForgetPass.Enabled= false;
}
else if (ChangeUser)
{
this.Text = «Обратикористувача»;
labelPass1.Text =«Пароль:»;
labelPass2.Text =«Новий пароль:»;
labelPass2.Enabled =textBoxPassword2.Enabled = false;
labelEmail.Enabled =textBoxEmail.Enabled = false;
}
else if (ChangeInfo)
{
this.Text = «Змінитиінформацію користувача»;
labelPass1.Text =«Старий пароль:»;
labelPass2.Text =«Новий пароль:»;
}
}
private voidbuttonSubmit_Click(object sender, EventArgs e)
{
try
{
errorProvider1.Clear();
#region Forgets thepassword
if(checkBoxForgetPass.Enabled && checkBoxForgetPass.Checked)
{
if(textBoxUsername.Text.Trim() == "")
{
errorProvider1.SetError(this.textBoxUsername,«Будь-ласка, введіть ім'я користувача»);
textBoxUsername.Focus();
return;
}
errorProvider1.Clear();
var user =Variables.xDocument.Descendants(«User»).Where(q =>q.Attribute(«UserName»).Value.ToLower() ==textBoxUsername.Text.Trim().ToLower());
if (user.Count()
{
errorProvider1.SetError(this.textBoxUsername,«Таке ім'я користувача відсутнє у базі даних!!!!»);
return;
}
string password =user.First().Attribute(«Password»).Value;
try
{
NetworkCredentialloginInfo = new NetworkCredential(«username», «password»);
MailMessage msg = newMailMessage();
msg.From = newMailAddress(«CyberkillerPS@gmail.ru»);
msg.To.Add(newMailAddress(user.First().Attribute(«Email»).Value));
msg.Subject =«Phonebook Password»;
msg.Body = «YoursPassword = » + password;
msg.IsBodyHtml = true;
SmtpClient client = newSmtpClient(«smtp.gmail.ru»);
client.EnableSsl = true;
client.UseDefaultCredentials= false;
client.Credentials =loginInfo;
client.Send(msg);
MessageBox.Show(«Вашпароль був відісланий вам на email», «Відправка пароля»,MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message,«Помилка», MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return;
}
#endregion
#region add new user
else if (this.NewUser)
{
if(textBoxUsername.Text.Trim() == "" &&textBoxUsername.Enabled)
{
errorProvider1.SetError(this.textBoxUsername,«Будь-ласка, введіть ім'я користувача»);
return;
}
else if(textBoxPassword1.Text.Trim() == "" &&textBoxPassword1.Enabled)
{
errorProvider1.SetError(this.textBoxPassword1,«Будь-ласка, введіть пароль»);
return;
}
else if(textBoxPassword2.Text.Trim() == "" &&textBoxPassword2.Enabled)
{
errorProvider1.SetError(this.textBoxPassword2,«Будь-ласка, введіть підтвердження пароля»);
return;
}
else if(textBoxPassword2.Text.Trim()!= textBoxPassword1.Text.Trim())
{
errorProvider1.SetError(this.textBoxPassword1,«Ваші паролі повинні співпадати»);
errorProvider1.SetError(this.textBoxPassword2,«Ваші паролі повинні співпадати»);
return;
}
else if(textBoxEmail.Text.Trim() == "" && textBoxEmail.Enabled)
{
errorProvider1.SetError(this.textBoxEmail,«Будь-ласка, введіть правельний Email»);
return;
}
if (!File.Exists(Variables.DBFile))
{
Variables.xDocument = newXDocument(
new XComment("\nDon't edit manually \n"),
newXElement(«PhoneBook»,
newXElement(«Users»,
newXElement(«User»,
newXAttribute(«ID», «01»),
newXAttribute(«UserName», textBoxUsername.Text.Trim()),
newXAttribute(«Password», textBoxPassword1.Text.Trim()),
newXAttribute(«Email», textBoxEmail.Text.Trim()),
newXAttribute(«RegDate», DateTime.Now.ToString()))),
newXElement(«Settings»,
newXElement(«Setting»,
newXAttribute(«UserID», «01»),
newXAttribute(«RightToLeft», «NO»),
newXAttribute(«Dates», «Persian»),
newXAttribute(«FontSize», «10»))),
newXElement(«Items»)));
Variables.CurrentUserID =«01»;
}
else
{
Variables.xDocument =XDocument.Parse(TripleDES.DecryptFromFile(Variables.DBFile, TripleDES.ByteKey,TripleDES.IV));
var SameUserQuery = fromq in Variables.xDocument.Descendants(«User»)
whereq.Attribute(«UserName»).Value.ToLower() == textBoxUsername.Text.Trim().ToLower()
select q;
if (SameUserQuery.Count()>= 1)
{
errorProvider1.SetError(this.textBoxUsername,«Таке ім'я користувача вже існує, Будь-ласка, оберіть інше»);
return;
}
int maxID = 0;
try
{
maxID = (from q inVariables.xDocument.Descendants(«User»)
select(int)q.Attribute(«ID»)).Max();
}
catch { }
maxID++;
Variables.CurrentUserID =maxID.ToString();
XElement xElement = newXElement(«User»,
newXAttribute(«ID», maxID),
newXAttribute(«UserName», textBoxUsername.Text.Trim()),
newXAttribute(«Password», textBoxPassword1.Text.Trim()),
newXAttribute(«Email», textBoxEmail.Text.Trim()),
newXAttribute(«RegDate», DateTime.Now.ToString()));
var usersElement = (fromq in Variables.xDocument.Descendants(«Users»)
select q).First();
usersElement.Add(xElement);
xElement = newXElement(«Setting»,
newXAttribute(«UserID», maxID),
newXAttribute(«RightToLeft», «NO»),
newXAttribute(«Dates», «Persian»),
newXAttribute(«FontSize», «10»));
var settingsElement =(from q in Variables.xDocument.Descendants(«Settings»)
select q).First();
settingsElement.Add(xElement);
}
Variables.CurrentUserName= textBoxUsername.Text.Trim();
TripleDES.EncryptToFile(Variables.xDocument.ToString(SaveOptions.DisableFormatting),Variables.DBFile, TripleDES.ByteKey, TripleDES.IV);
//Variables.xDocument.Save(«debug.xml»);
}
#endregion
#region change user
else if (this.ChangeUser)
{
if (Variables.xDocument== null)
{
MessageBox.Show(«Вашеім'я користувача та пароль невірні», «Помилка»,MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if(textBoxUsername.Text.Trim() == "")
{
errorProvider1.SetError(this.textBoxUsername,«Будь-ласка, введіть ім'я користувача»);
return;
}
else if(textBoxPassword1.Text.Trim() == "" &&textBoxPassword1.Enabled)
{
errorProvider1.SetError(this.textBoxPassword1,«Будь-ласка, введіть пароль»);
return;
}
var query = from q inVariables.xDocument.Descendants(«User»)
wheretextBoxUsername.Text.Trim().ToLower() ==q.Attribute(«UserName»).Value.ToLower()
&&textBoxPassword1.Text.Trim().ToLower() ==q.Attribute(«Password»).Value.ToLower()
select q;
if (query.Count() == 1)
{
Variables.CurrentUserID =query.First().Attribute(«ID»).Value;
Variables.CurrentUserName= textBoxUsername.Text.Trim();
}
else
{
Variables.CurrentUserID ="";
Variables.CurrentUserName= "";
MessageBox.Show(«Вашеім'я користувача та пароль невірні», «Помилка»,MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
#endregion
#region change info
else if (this.ChangeInfo)
{
bool changePassword =true;
if(textBoxUsername.Text.Trim() == "" &&textBoxUsername.Enabled)
{
errorProvider1.SetError(this.textBoxUsername,«Ваше ім'я користувача та пароль невірні»);
return;
}
else if(textBoxEmail.Text.Trim() == "" && textBoxEmail.Enabled)
{
errorProvider1.SetError(this.textBoxEmail,«Будь-ласка, введіть вірний Email»);
return;
}
else if(textBoxPassword1.Text.Trim() == textBoxPassword2.Text.Trim() &&textBoxPassword2.Text.Trim() == "")
{
changePassword = false;
}
else if (textBoxPassword1.Text.Trim()== "" && textBoxPassword1.Enabled)
{
errorProvider1.SetError(this.textBoxPassword1,«Будь-ласка, введіть старий пароль»);
return;
}
else if(textBoxPassword2.Text.Trim() == "" &&textBoxPassword2.Enabled)
{
errorProvider1.SetError(this.textBoxPassword2,«Будь-ласка, введіть новий пароль»);
return;
}
errorProvider1.Clear();
var query = (from q inVariables.xDocument.Descendants(«User»)
whereq.Attribute(«ID»).Value == Variables.CurrentUserID
select q).First();
string oldPassword =query.Attribute(«Password»).Value;
if (oldPassword.ToLower()!=textBoxPassword1.Text.Trim().ToLower() && changePassword)
{
errorProvider1.SetError(this.textBoxPassword1,«Старий пароль невірний»);
return;
}
else if (oldPassword ==textBoxPassword1.Text.Trim() && changePassword)
{
query.Attribute(«UserName»).Value= textBoxUsername.Text.Trim();
query.Attribute(«Password»).Value= textBoxPassword2.Text.Trim();
query.Attribute(«Email»).Value= textBoxEmail.Text.Trim();
}
else if (!changePassword)
{
query.Attribute(«UserName»).Value= textBoxUsername.Text.Trim();
query.Attribute(«Email»).Value= textBoxEmail.Text.Trim();
}
Variables.CurrentUserID =query.Attribute(«ID»).Value;
Variables.CurrentUserName= textBoxUsername.Text.Trim();
TripleDES.EncryptToFile(Variables.xDocument.ToString(SaveOptions.DisableFormatting),Variables.DBFile, TripleDES.ByteKey, TripleDES.IV);
//Variables.xDocument.Save(«debug.xml»);
}
#endregion
this.Close();
}
catch (Exception ex)
{
Variables.CurrentUserID =Variables.CurrentUserName = "";
StackFrame file_info =new StackFrame(true);
Messages.error(reffile_info, ex.Message, this);
}
}
}
}
Додаток 2: Головне вікно програми
/>
Додаток 3: Форма користувача БД
/>
Додаток 4: Форма створення нового запису в БД
/>