Проектирование информационной системы "Администратор гостиницы"

 















Проектирование информационной системы «Администратор гостиницы»


1. Системный анализ предметной области


База данных системы должна содержать:

·Данные о классах номеров

·Список номеров

·Данные о клиентах

·Данные о заселении клиентов

·Возможность выписывать счета на оплату

·Возможность поиска клиентов.

Базовые сущности:

Гостиничные номера:

·Название номера

·Класс номера

·Этаж

·Количество мест

·Стоимость проживания.

Список клиентов:

·Фамилия И.О.

·Паспортные данные

Регистрация проживания:

·Заезжающий клиент

·Номер

·Дата приезда

·Дата отъезда


. Нормализация


Первая нормальная форма

Таблица находится в первой нормальной форме, если она удовлетворяет следующим требованиям:

·Не содержит полей с несколькими значениями

·Ключевое поле не имеет пустот

В нашем случае в таблице клиентов паспортные данные клиентов могут содержать номер серию дату выдачи и место выдачи поэтому необходимо разбить это поле на : p_nomer, p_serial, p_data, p_point.

Для выполнения второго условия необходимо ввести ключевые поля.

Проанализируем:



Вторая нормальная форма:

Таблица находится во второй нормальной форме, если она удовлетворяет следующим требованиям:

·Таблица приведена к 1НФ

·Поля, которые зависят от части первичного ключа должны бить выведены в состав отдельных таблиц

·Все таблицы должны быть связаны между собой

В рассматриваемом примере таблицы уже приведены к 1НФ, то есть одно из требований выполнено.

В таблице Numbers поле CostDay зависит от поля Klass, поэтому надо создать отдельную таблицу содержащую классы номеров.

Для выполнения третьего условия необходимо назначить внешние ключи:

·Связываем таблицы Numbers и Klass по полю Klass

·Связываем таблицы Reestr и Numbers по полю Numer

·Связываем таблицы Reestr и Klients по полю Klient

Третья нормальная форма:

Таблица находится в третьей нормальной форме, если она удовлетворяет следующим требованиям:

·Таблица приведена к 2НФ

·Не должно быть транзитивных зависимостей между не ключевыми полями

В итоге база данных принимает вид:



Таблица 1 Физическое проектирование базы данных.

nametypeKeyextraТаблица классов номеров (Num_klass)Idinteger primary keyauto_incrementNamevarchar (20)CostDayfloatСписок гостиничных номеров(Numbers)Idinteger primary keyauto_incrementNumervarchar(10) uniqueKlassintegerForeign keyREFERENCES Num_klass (id)stageintegerplacesintegerТаблица клиентов(Klients)Idinteger primary keyauto_incrementFIOvarchar(50)p_pointvarchar(50)p_nomer Integerp_serial Integerp_data dateТаблица регистрационных действий(Reestr)Idinteger primary keyauto_incrementklientintegerForeign keyREFERENCES klients (id)numerintegerForeign keyREFERENCES numbers (id)data_pdatedata_otdate

. Реализация структуры базы данных в СУБД MySQL


1. Запросы на создание таблиц:


create table Num_klass (integer primary key auto_increment,varchar(20),float

);table Numbers (integer primary key auto_increment,varchar(10) unique,integer,integer,integer,FOREIGN KEY ( klass ) REFERENCES Num_klass (id)

);table klients (integer primary key auto_increment, varchar(50),

pasport varchar(50)

);

create table reestr (integer primary key auto_increment,integer,integer,_p date,_ot date,FOREIGN KEY ( numer ) REFERENCES numbers (id),FOREIGN KEY ( klient ) REFERENCES klients (id)

);


2. Запросы на добавление данных

into num_klass(name,costday)values("Vip",10000);into num_klass(name,costday)values("Luxe",8000);into num_klass(name,costday)values("Premium",6000);into num_klass(name,costday)values("Less",4000);into num_klass(name,costday)values("Budget",2000);into Numbers(numer,klass,stage,places)values("1408",1,5,2);into Numbers(numer,klass,stage,places)values("1407",2,4,3);into Numbers(numer,klass,stage,places)values("1406",3,3,4);into Numbers(numer,klass,stage,places)values("1405",4,2,5);into Numbers(numer,klass,stage,places)values("1404",5,1,6);into Klients(FIO,pasport)values("Ivanov V.V.","qw2467");into Klients(FIO,pasport)values("Petrov A.V.","evta89490");into Klients(FIO,pasport)values("Sidorov V.A.","khskj3546");into Klients(FIO,pasport)values("Putin V.V.","qlkj53050");into Klients(FIO,pasport)values("Geyts Bil","f*jio967");into Reestr(klient,numer,data_p,data_ot)values(1,1,130101,130621);into Reestr(klient,numer,data_p,data_ot)values(2,2,130201,130321);into Reestr(klient,numer,data_p,data_ot)values(2,2,130401,130621);into Reestr(klient,numer,data_p,data_ot)values(3,3,130101,130621);into Reestr(klient,numer,data_p,data_ot)values(4,4,130301,130510);into Reestr(klient,numer,data_p,data_ot)values(4,4,130521,130621);into Reestr(klient,numer,data_p,data_ot)values(5,5,130101,130202);into Reestr(klient,numer,data_p,data_ot)values(5,5,130203,130303);into Reestr(klient,numer,data_p,data_ot)values(5,5,130310,130509);into Reestr(klient,numer,data_p,data_ot)values(5,5,130521,130621);


. Запросы на выборку данных.

Выбрать из справочной таблицы наименования и отсортировать их по двум произвольным имеющемуся в таблице признакам


Select * from klients order by fio,pasport;



Select Numer ,places from numbers order by stage;



Выбрать из указанной таблицы те записи, которые удовлетворяют условию отбора (where).


Select * from reestr where data_ot<CURRENT_DATE;


Select * from reestr where klient in (1,2,3);



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


select k.fio, r.data_p from reestr r inner join klients k on k.id= r.numer;



select k.name, n.numer from numbers n inner join num_klass k on k.id= n.klass;



Привести примеры 2-3 запросов с использованием агрегатных функций.


select count(numer) from numbers;



select max(costday) from num_klass;



Выбрать из таблиц информацию об объектах, значение произвольного атрибута в которых входит в заданный диапазон значений (чисел или дат).


select k.fio, n.numer, r.data_p, r.data_ot from reestr r join klients k on k.id=r.klientjoin numbers n on n.id=r.numer(r.data_ot>Current_date) and (r.data_p<=Current_date);



Привести пример вложенных запросов


select * from Numbers n where places > (count(numer) from reestr r where (r.numer=n.id)and (r.data_ot>CURRENT_DATE));



Получить список признаков для которых есть более одной записи.

запрос триггер программный


select * from (select k.fio, count(r.klient)as kol from reestr r left join klients k on k.id=r.klient group by k.fio) b b.kol>2;



Реализовать процедуру


Delimiter //procedure myproc (out t integer(11))DETERMINISTICSECURITY INVOKERcount(name) t from klients;;

//


Реализовать триггер


Create trigger ins_user after insert on reestr for each row set new.createdate = Current_date; ;


Реализовать функцию


Create function getKlient (search_id int)tinytextn tinytext;name into n from clients where id=search_id;n;;

//


Внешний вид


Рис 1. Главное окно.


Рис 2. Регистрация нового клиента.

Рис 3. Добавление нового номера.


Рис 4. Выписать счет на оплату.


Приложение


Программный код WEB-страниц


Index.php (см. рис 1)

<?include "base.php";

$r=ComandEnc("reestr",$_REQUEST);(isset($_REQUEST[send_mod]))

{$curid = $_REQUEST[id]; "<HTML><HEAD>

<META HTTP-EQUIV='Refresh' CONTENT='0; URL=invoice.php?id=$curid'>

</HEAD></HTML>"; }?>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Операции с номерами</title>

<link rel="stylesheet" type="text/css" href="cs.css">

</head>

<body>

<form action="index.php" method="post" name="input_num">

<table>

<tr>

<td>

<table border="1" cellpadding="0" cellspacing="0">

<tr><td colspan="2" align="center"><strong>Регистрация заселения</strong>

<input type="hidden" name="id" value=<? echo($r[0]) ?>>

</td></tr>

<tr><td width="150">Клиент :</td>

<td>

<?GetPickData("select * from Klients","",1,"klient",$r[1]);?>

<a href ="klients.php">Новый клиент</a>

</td></tr>

<tr><td width="150">Номер :</td>

<td><? GetPickData("select * from Numbers n where places > (select count(numer) from reestr r (r.numer=n.id)and (r.data_ot>CURRENT_DATE)); ","* from Numbers n where places <= (select count(numer) from reestr r (r.numer=n.id)and (r.data_ot>CURRENT_DATE));",1,"numer",$r[2]);?>

<a href ="AddNum.php">Новый номер</a> <br></td></tr>

<tr><td width="150">Дата приезда :</td>

<td><input type="text" name="data_p" maxlength="30" value=<? echo($r[3])?> ></td></tr>

<tr><td width="150">Дата отъезда :</td>

<td><input type="text" name="data_ot" maxlength="30" value=<? echo($r[4])?> ></td>

</tr><tr>

<td colspan="2" align="center"><input type="submit" name="prev" value="<<<" />

<input type="submit" name="next" value=">>>" /><input type="submit" name="add" value="Добавить"></td>

</tr><tr><td colspan="2" align="center">

<input type="submit" name="insert_data" value="Сохранить" />

<input type="submit" name="delete_data" value="Удалить" />

<input type="submit" name="send_mod" value="Счет на оплату" />

</td> </tr></table></td><tr><td><table border=1><tr>

<td colspan=4> Список проживающих клиентов</td></tr><tr>

<td colspan = 4> <input type="text" name="edit_search">

<input>

</td></tr><tr><td>Клиент</td><td>Номер</td><td>Дата приезда</td>

<td>Дата отъезда</td></tr>

<?if (isset($_REQUEST[search]))

{$sql="select k.fio, n.numer, r.data_p, r.data_ot from reestr r left join klients k on k.id=r.klient left join numbers n on n.id=r.numer where (r.data_ot>Current_date) and (r.data_p<=Current_date)and(k.fio like $_REQUEST[edit_search]% )";

}else

$sql="select k.fio, n.numer, r.data_p, r.data_ot from reestr r left join klients k on k.id=r.klient left join numbers n on n.id=r.numer where (r.data_ot>Current_date) and (r.data_p<=Current_date)";($sql , 0);?></td>

</tr></table></form></body></html>.php

<?php_reporting(0);(!isset($db))

{ $hostname = "localhost";

$username = "root";

$password = ""; _connect($hostname, $username, $password) or die ("Ошибка коннекта!!");

$db="Hot_admin";_select_db($db) or die (mysql_error());_query("SET NAMES 'cp1251'");_query("SET CHARACTER SET 'cp1251'");}CheckDup($tbl,$field, $value){

$res=mysql_query("SELECT * FROM $tbl where $field = $value");(mysql_fetch_row($res)){1;}{0;}}GetRow($sql){mysql_fetch_row(mysql_query($sql));}RowToForm($tbl,$id)

{$db=$GLOBALS['db'];

$list_f = mysql_list_fields($db , $tbl);

$name_f = mysql_field_name($list_f , 0);

$Cur=mysql_fetch_row(mysql_query("select * from $tbl where $name_f = $id;"));$Cur;}getNext($tbl,$cur)

{$db=$GLOBALS['db'];

$list_f = mysql_list_fields($db, $tbl);

$name_f = mysql_field_name($list_f,0);

$res=mysql_query("SELECT $name_f FROM $tbl WHERE $name_f>$cur ORDER BY $name_f ASC LIMIT 1");($next=mysql_fetch_row($res)){RowToForm($tbl,$next[0]);}return RowToForm($tbl,$cur);}getPrev($tbl,$cur){

$db=$GLOBALS['db'];

$list_f = mysql_list_fields($db, $tbl);

$name_f = mysql_field_name($list_f,0);

$res=mysql_query("SELECT $name_f FROM $tbl WHERE $name_f<$cur ORDER BY $name_f DESC LIMIT 1");($prev=mysql_fetch_row($res)){RowToForm($tbl,$prev[0]);}RowToForm($tbl,$cur);}insert($tbl)

{ $db=$GLOBALS['db'];

$list_f = mysql_list_fields($db, $tbl);

$n = mysql_num_fields($list_f);

$name_f = mysql_field_name($list_f,0);

$value = $_POST[$name_f];(CheckDup($tbl,$name_f,$value)){

$sql = "Update $tbl SET ";

$wh=$where= " where $name_f = $value";}{

$wh=" where $name_f in (select max($name_f) from $tbl)";

$sql = "INSERT INTO $tbl SET "; }($i = 0; $i < $n; $i++){

$name_f = mysql_field_name($list_f,$i);($name_f!="id") {

$value = $_POST[$name_f];

$j = $i + 1;

$sql = $sql.$name_f." = '$value'";($j <> $n) $sql = $sql.", ";}}(isset($where)){

$sql.=$where;}_query($sql) or die(mysql_error());

$res=mysql_query("select * from $tbl $wh");mysql_fetch_row($res);}View($tbl, $NeedHead){(!stristr(strtoupper($tbl),"SELECT")) {($NeedHead)

{echo "<b>$Tbl</b><table border=1>";

$result=mysql_query("describe $tbl;");"<tr>";($myrow = mysql_fetch_row($result)){"<td>$myrow[0]</td>";}"</tr>";}

$result=mysql_query("select * from $tbl;");}{$result=mysql_query($tbl);}($myrow = mysql_fetch_row($result))

{echo "<tr>";for ($i=0; $i<count($myrow); $i++) {"<td>$myrow[$i]</td>";}echo "</tr>";}"</table><p>";mysql_close();}delete_record($tbl,$id)

{$db=$GLOBALS['db'];

$list_f = mysql_list_fields($db, $tbl);

$name_f = mysql_field_name($list_f,0);

$sql = "Delete from $tbl where $name_f = $id";

$result=mysql_query($sql)or die (mysql_error());

$res=mysql_query("select * from $tbl where $name_f in (select min($name_f) from $tbl) ");return mysql_fetch_row($res);}GetPickData($sqlActive,$sqlDisable,$field,$name,$selection)

{echo "<select name=$name >";

$res=mysql_query($sqlActive);($row = mysql_fetch_row($res))

{if ($selection==$row[0])

{echo "<option selected value=$row[0]>$row[$field]</option>";}else"<option value=$row[0]>$row[$field]</option>";}($sqlDisable!=""){

$res=mysql_query($sqlDisable);($row = mysql_fetch_row($res)){($selection==$row[0]){echo "<option disabled selected value=$row[0]>$row[$field]</option>";}else"<option disabled value=$row[0]>$row[$field]</option>";}}"</select>";}ComandEnc ($tbl){(isset($_REQUEST[insert_data]))

{$Num=insert($tbl);}(isset($_REQUEST[view_data])){View($tbl , 1);}(isset($_REQUEST[delete_data])){(isset($_REQUEST[id])){$v=$_REQUEST[id];($v==""){$v=0;}}else $v = 0; $Num=delete_record($tbl , $v);}(isset($_REQUEST[next])){(isset($_REQUEST[id])){$v=$_REQUEST[id];($v==""){$v=0;}}else $v = 0;$Num=getNext($tbl,$v);}(isset($_REQUEST[prev])){(isset($_REQUEST[id])){$v=$_REQUEST[id];($v==""){$v=0;}}else $v = 0;$Num=getPrev($tbl,$v);}(isset($_REQUEST[add])){$Num="";}$Num;}?>_Numer.php (см. рис 3)

<?include "base.php";

$Num=ComandEnc("Numbers");?>

<html><head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Справочники</title>

<link rel="stylesheet" type="text/css" href="cs.css">

</head><body>

<a href ="index.php">На главную</a>

<table border="1" cellpadding="0" cellspacing="0">

<form action="addnum.php" method="post">

<tr><td colspan="2" align="center"><strong>Информация по номеру</strong>

<input type="hidden" name="id" value=<? echo($Num[0]) ?>>

</td></tr>

<tr><td width="150">Номер :</td>

<td><input type="text" name="Numer" maxlength="10" value=<?echo($Num[1])?> ></td></tr>

<tr><td width="150">Класс номера :</td><td>

<?GetPickData("select * from Num_klass","",1,"Klass",$Num[2]);?></td></tr>

<tr><td width="150">Этаж :</td>

<td><input type="text" name="stage" maxlength="30" value=<?echo($Num[3])?>></td></tr>

<tr><td width="150">Число мест :</td><td><input type="text" name="places" maxlength="30" value=<? echo($Num[4])?> ></td></tr>

<tr><td colspan="2" align="center">

<input type="submit" name="prev" value="<<<" />

<input type="submit" name="next" value=">>>" />

<input type="submit" name="add" value="Добавить" /></td></tr><tr>

<td colspan="2" align="center">

<input type="submit" name="insert_data" value="Сохранить" />

<input type="submit" name="delete_data" value="Удалить" />

</td> </tr></form></table>

<table border=1><tr><td>№</td><td>Номер двери</td><td>Класс номера</td>

<td>Этаж</td><td>Колчество мест</td><?View("Numbers" , 0);?>

</body></html>.php (см. рис 2)

<?include "base.php";$r=ComandEnc("klients");?>

<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /><title>Операции с номерами</title>

<link rel="stylesheet" type="text/css" href="cs.css">

</head><body>

<a href ="index.php">На главную</a>

<form action="klients.php" method="post" name="input_gost">

<table border="1" cellpadding="0" cellspacing="0"><tr>

<td colspan="2" align="center"><strong>Регистрация гостя </strong>

<input type="hidden" name="id" value=<? echo($r[0]) ?>>

</td></tr><tr><td width="150">Фамилия И.О. :</td><td>

<input type="text" name="FIO" maxlength="20" value=<? echo($r[1])?> >

</td></tr><tr><td width="150">Данные документа :</td>

<td><input type="text" name="pasport" maxlength="30" value=<? echo($r[2])?>></td></tr><tr><td colspan="2" align="center">

<input type="submit" name="prev" value="<<<" />

<input type="submit" name="next" value=">>>" />

<input type="submit" name="add" value="Добавить" />

</td></tr><tr><td colspan="2" align="center">

<input type="submit" name="insert_data" value="Сохранить" />

<input type="submit" name="delete_data" value="Удалить" />

</td> </tr></table><table border=1><tr><td>№</td><td>Фамилия И.О.</td>

<td>Даные</td><?View("klients" , 0);?></form></body></html>.php (см. рис 4)

<?include "base.php";

$r=GetRow("select r.data_p,r.data_ot,(r.data_ot-r.data_p)as kol,kl.costday from reestr r Numbers n on n.id= r.numernum_klass kl on kl.id=r.numer" );?>

<html><head> <title>"Счет на оплату"</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <style>{ width: 210mm; margin-left: auto; margin-right: auto; border: 1px #efefef solid; font-size: 11pt;}.invoice_bank_rekv { border-collapse: collapse; border: 1px solid; }.invoice_bank_rekv > tbody > tr > td, table.invoice_bank_rekv > tr > td { border: 1px solid; }.invoice_items { border: 1px solid; border-collapse: collapse;}.invoice_items td, table.invoice_items th { border: 1px solid;}

</style></head><body>

<div style="font-weight: bold; font-size: 16pt; padding-left:5px;">

Счет № <? echo($_GET[id]) ?> от <? echo (date( 'd.m.Y'))?></div>

<br/><table width="100%"> <tr><td style="width: 30mm;">

<div style=" padding-left:2px;">Поставщик: </div></td> <td>

<div style="font-weight:bold; padding-left:2px;"> ____________________________________________</div></td></tr><tr>

<td style="width: 30mm;">

<div style=" padding-left:2px;">Покупатель: </div></td><td>

<div style="font-weight:bold; padding-left:2px;"> _____________________________________________</div></td></tr></table>

<table>

<thead><tr><th>Дата приезда</th>

<th >Дата отъезда</th>

<th>Количество дней</th>

<th>Цена за день</th>

<th>Сумма</th></tr><tr>

<td style="width:27mm; font-weight:bold; text-align:left;"><?echo($r[0])?></td>

<td style="width:27mm; font-weight:bold; text-align:left;"><?echo($r[1])?></td>

<td style="width:27mm; font-weight:bold; text-lign:right;"><?echo($r[2])?></td>

<td style="width:27mm; font-weight:bold; text-align:right;"><? echo($r[3])?>

</td>

<td style="width:27mm; font-weight:bold; text-align:right;"> <?echo($r[3]*$r[2])?></td></tr></thead><tbody ></tbody></table>

<table border="0" width="100%" cellpadding="1" cellspacing="1"><tr>

</tr></table><br /><div>

Всего на сумму <?echo ($r[3]*$r[2])?> рублей.<br />

<br /><br />

<div style="background-color:#000000; width:100%; font-size:1px; height:2px;">&nbsp;</div><br/>

<div>Руководитель ______________________ (Фамилия И.О.)</div>

<br/>

<div>Главный бухгалтер ______________________ (Фамилия И.О.)</div><br/>

<div style="width: 85mm;text-align:center;">М.П.</div>

<br/><div style="width:800px;text-align:left;font-size:10pt;">Счет действителен к оплате в течении трех дней.</div></body></html>.css{ font: 12px Georgia; color: #666666; }{ font-size: 16px; text-align: center; }{ width: 400px; border-collapse: collapse; margin: 0px auto; background: #E6E6E6; }{ padding: 3px; }{ width: 150px; border: solid 1px #CCCCCC; }.tbl{width:100%; border:0; background: #ffffff;}.small { width: 50px; border: solid 1px #CCCCCC; }.smily { width: 10px; border: solid 1px #CCCCCC; }

Список литературы


1.Самоучитель MySQL 5. автор М.Кузнецов

2.Сайт, посвященный СУБД MySQL

.Разработка на языке PHP

.Электронная энциклопедия


Проектирование информационной системы «Администратор гостиницы» 1. Системный анализ пре

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ