Проектирование информационной системы "Администратор гостиницы"
Проектирование информационной системы «Администратор гостиницы»
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;"> </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
.Электронная энциклопедия
Больше работ по теме:
Предмет: Информационное обеспечение, программирование
Тип работы: Курсовая работа (т)
Новости образования
КОНТАКТНЫЙ EMAIL: [email protected]
Скачать реферат © 2017 | Пользовательское соглашение
ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ