|
|
|
Выбор структуры БД для MS SQL Serv
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток! Имеется фирма, продающая экскурсионные туры. Каждый тур имеет определенный маршрут(например, тур по Золотому кольцу "Ожившая старина" включает в себя города Владимир, Боголюбово и Суздаль). Покупая тур, клиент выбирает из базы для каждого пункта маршрута гостиницу, в которой он желает оставаться на время пребывания. Если создавать БД на Access, то у меня получается примерно такая схема данных(привёл для наглядности): То есть, по моему замыслу, после оформления договора с клиентом на покупку тура, соответствующие этому туру пункты маршрута копируются из таблицы "Маршрут" в таблицу "Гостиницы_в_туре", где уже для каждого пункта в зависимости от договора устанавливается гостиница. При этом в access'e каскадное удаление из таблицы "Гостиницы_в_туре" устанавливается без проблем. Тем не менее в качестве СУБД мне нужен MS SQL Server(2008), где каскадное удаление и триггеры на удаление связанных записей из этой же таблицы при такой схеме работать отказываются. Все, к кому ни обращался за помощью, утверждают, что допущена ошибка в проектировании. В таком случае, может быть, найдутся те, кто предложит правильный вариант структуры для этой базы данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2011, 22:32 |
|
||
|
Выбор структуры БД для MS SQL Serv
|
|||
|---|---|---|---|
|
#18+
Гостиницы должны быть связаны 1:М c городами, тогда после выбора тура можно будет для каждого города предложить клиенту список гостиниц, чтобы он выбрал одну, конкретную. По вашей текущей схеме это сделать нельзя. Сбивает с толку именование полей. Вы б уж как-нибудь однообразно называли PK и FK. Мне больше нравится когда и PK в основной таблице и FK, на него ссылающийся их другой, называются одинакого. У вас то Код, то Код_<Сущность> - всякий раз по-разному ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2011, 08:18 |
|
||
|
Выбор структуры БД для MS SQL Serv
|
|||
|---|---|---|---|
|
#18+
Да, Вы правы, прошу прощения. Я торопился при создании варианта в access, вот и допустил ошибки. Переделал и связал нужные таблицы: Не нравятся мне таблицы "Маршрут" и "Гостиницы в туре". По количеству записей они практически дублируют друг друга. Но до другого решения дойти не могу :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2011, 14:08 |
|
||
|
Выбор структуры БД для MS SQL Serv
|
|||
|---|---|---|---|
|
#18+
BadVodkaНе нравятся мне таблицы "Маршрут" и "Гостиницы в туре". По количеству записей они практически дублируют друг друга. Но до другого решения дойти не могу :( Согласно вашему ТЗ именно так и должно быть. Сначала - определение маршрута, затем - выбор гостиниц по пуктам маршрута. Причем, в каком-то городе можно быть проездом, и не останавливаться в нем в гостинице. Количество записей будет разное. Можно будет получать пукты, где проездом и где - с остановкой на ночь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2011, 14:22 |
|
||
|
Выбор структуры БД для MS SQL Serv
|
|||
|---|---|---|---|
|
#18+
Хм, но как при такой структуре поддерживать целостность данных? Предположим, что следует хранить в памяти данные о предыдущих поездках и остановках клиентов(то есть содержание таблицы "Гостиницы_в_туре"). Или, скажем, клиент купил тур и уже отправился в него. После чего возникла нужда удалить пункт маршрута в этом же туре. Самым простым было бы удалить ненужную запись из таблицы "Маршрут", но этого умная СУБД не позволит сделать, ибо тогда в таблице "Гостиницы_в_туре" появятся ссылающиеся на несуществующее значение записи. Удалять каскадно в таком случае тоже нельзя, ибо тогда удалятся связанные записи о текущих и прошлых поездках, т.е. нужная "хистори". Возможен вариант убрать FK, идущий от сущности "Маршрут" к "Гостиницы_в_туре", и при этом вручную контролировать ввод, используя триггеры/макросы, но сомневаюсь, что преподаватели меня за такое решение по голове погладят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2011, 15:01 |
|
||
|
Выбор структуры БД для MS SQL Serv
|
|||
|---|---|---|---|
|
#18+
Собственно, подобное и заставило меня усомниться в правильности разработанной структуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2011, 15:03 |
|
||
|
Выбор структуры БД для MS SQL Serv
|
|||
|---|---|---|---|
|
#18+
MS SQL сервер не позволит вам иметь каскадное обновление/удаление по двум графам связей: Города-Маршрут-Гостинницы в туре-Гостинницы Города-Гостинницы По одному из графов от этого придется отказаться. Но, если этого боятся преподы из-за приверженности к высокой теории нормализации, то с точки зрения практики разработки в этом нет никакого недостатка. Автоинкрементальный счетчик делает ненужным каскадное обновление. Каскадное удаление, как правило, опасно, потому что при ошибочном удалении записи из справочника можно грохуть целую гроздь тянущихся за ней важных наборов данных. Если удаляется случайно заведенна строка из справочника, на которую еще не повесили реальных данных, все удаляется без проблем. Если же нужно действительно уничтожить большой кусок данных, то лучше это сделать явной процедурой, обходя таблицы в правильном порядке. Практически я чаще всего ставлю (каскадное удаление и обновление = нет), но при этом сервер прекрасно следит за нарушениями ссылочной целостности, не позволяя иметь записи, в которых FK указывают неизвстно на что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2011, 15:36 |
|
||
|
Выбор структуры БД для MS SQL Serv
|
|||
|---|---|---|---|
|
#18+
Спасибо Вам за ваше терпение и помощь, П-Л! Буду осуществлять удаление связанных записей при помощи написанных вручную процедур. Просто где-то вычитал, что при помощи встроенных в субд функций(в данном случае каскадного удаления) процесс будет быстрее. Возникла ещё одна проблема. Требуется хранить историю проданных договоров и гостиницы, в которых человек останавливался в определенных пунктах своего маршрута. Но и следует каким-то образом предусмотреть возможность редактирования(а именно удаления пунктов маршрута) состава действующих туров - присутствие же связанных записей в таблице "Гостиницы_в_туре" этого сделать не даст. Можно, конечно, вместо редактирования имеющегося тура каждый раз создавать новый, но это вызовет обилие повторяющихся записей, да и пользователю забивать, допустим, 15 пунктов маршрута каждый раз, когда нужно удалить всего один, будет неудобно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2011, 17:31 |
|
||
|
Выбор структуры БД для MS SQL Serv
|
|||
|---|---|---|---|
|
#18+
On 31.05.2011 18:31, BadVodka wrote: > Спасибо Вам за ваше терпение и помощь, П-Л! Буду осуществлять удаление связанных > записей при помощи написанных вручную процедур. Просто где-то вычитал, что при > помощи встроенных в субд функций(в данном случае каскадного удаления) процесс > будет быстрее. Быстрее-то он по-всякому не будет. Что так, что эдак. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2011, 17:35 |
|
||
|
Выбор структуры БД для MS SQL Serv
|
|||
|---|---|---|---|
|
#18+
BadVodkaВозникла ещё одна проблема. Требуется хранить историю проданных договоров и гостиницы, в которых человек останавливался в определенных пунктах своего маршрута. Но и следует каким-то образом предусмотреть возможность редактирования(а именно удаления пунктов маршрута) состава действующих туров - присутствие же связанных записей в таблице "Гостиницы_в_туре" этого сделать не даст. Можно, конечно, вместо редактирования имеющегося тура каждый раз создавать новый, но это вызовет обилие повторяющихся записей, да и пользователю забивать, допустим, 15 пунктов маршрута каждый раз, когда нужно удалить всего один, будет неудобно. Это не проблема. Вы напрасно боитесь объемов данных. Даже персональные СУБД типа аксесс легко перевариваривают десятки и сотни тысяч записей. Структура БД тоже пока у вас более чем несложная. Требуется хранить историю проданных договоров - Поэтому удаление пунктов маршрута - это создание нового маршрута. Редактировать имеющийся нельзя. Новый же очень легко получить сняв кальку со старого и потом поменять/добавить/удалить пару пуктов. И для базы абсолютно ненапряжно и интерфейс можно сделать удобный, чтобы решать это за считанные клики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2011, 08:30 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=60&tid=1542143]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
173ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 452ms |

| 0 / 0 |
