Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выбор структуры БД для MS SQL Serv / 10 сообщений из 10, страница 1 из 1
30.05.2011, 22:32
    #37286369
BadVodka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор структуры БД для MS SQL Serv
Всем доброго времени суток!

Имеется фирма, продающая экскурсионные туры. Каждый тур имеет определенный маршрут(например, тур по Золотому кольцу "Ожившая старина" включает в себя города Владимир, Боголюбово и Суздаль). Покупая тур, клиент выбирает из базы для каждого пункта маршрута гостиницу, в которой он желает оставаться на время пребывания.
Если создавать БД на Access, то у меня получается примерно такая схема данных(привёл для наглядности):

То есть, по моему замыслу, после оформления договора с клиентом на покупку тура, соответствующие этому туру пункты маршрута копируются из таблицы "Маршрут" в таблицу "Гостиницы_в_туре", где уже для каждого пункта в зависимости от договора устанавливается гостиница. При этом в access'e каскадное удаление из таблицы "Гостиницы_в_туре" устанавливается без проблем.
Тем не менее в качестве СУБД мне нужен MS SQL Server(2008), где каскадное удаление и триггеры на удаление связанных записей из этой же таблицы при такой схеме работать отказываются. Все, к кому ни обращался за помощью, утверждают, что допущена ошибка в проектировании. В таком случае, может быть, найдутся те, кто предложит правильный вариант структуры для этой базы данных?
...
Рейтинг: 0 / 0
31.05.2011, 08:18
    #37286564
П-Л
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор структуры БД для MS SQL Serv
Гостиницы должны быть связаны 1:М c городами, тогда после выбора тура можно будет для каждого города предложить клиенту список гостиниц, чтобы он выбрал одну, конкретную. По вашей текущей схеме это сделать нельзя.

Сбивает с толку именование полей. Вы б уж как-нибудь однообразно называли PK и FK. Мне больше нравится когда и PK в основной таблице и FK, на него ссылающийся их другой, называются одинакого. У вас то Код, то Код_<Сущность> - всякий раз по-разному
...
Рейтинг: 0 / 0
31.05.2011, 14:08
    #37287249
BadVodka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор структуры БД для MS SQL Serv
Да, Вы правы, прошу прощения. Я торопился при создании варианта в access, вот и допустил ошибки. Переделал и связал нужные таблицы:


Не нравятся мне таблицы "Маршрут" и "Гостиницы в туре". По количеству записей они практически дублируют друг друга. Но до другого решения дойти не могу :(
...
Рейтинг: 0 / 0
31.05.2011, 14:22
    #37287287
П-Л
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор структуры БД для MS SQL Serv
BadVodkaНе нравятся мне таблицы "Маршрут" и "Гостиницы в туре". По количеству записей они практически дублируют друг друга. Но до другого решения дойти не могу :(
Согласно вашему ТЗ именно так и должно быть. Сначала - определение маршрута, затем - выбор гостиниц по пуктам маршрута. Причем, в каком-то городе можно быть проездом, и не останавливаться в нем в гостинице. Количество записей будет разное. Можно будет получать пукты, где проездом и где - с остановкой на ночь.
...
Рейтинг: 0 / 0
31.05.2011, 15:01
    #37287405
BadVodka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор структуры БД для MS SQL Serv
Хм, но как при такой структуре поддерживать целостность данных?
Предположим, что следует хранить в памяти данные о предыдущих поездках и остановках клиентов(то есть содержание таблицы "Гостиницы_в_туре"). Или, скажем, клиент купил тур и уже отправился в него. После чего возникла нужда удалить пункт маршрута в этом же туре. Самым простым было бы удалить ненужную запись из таблицы "Маршрут", но этого умная СУБД не позволит сделать, ибо тогда в таблице "Гостиницы_в_туре" появятся ссылающиеся на несуществующее значение записи. Удалять каскадно в таком случае тоже нельзя, ибо тогда удалятся связанные записи о текущих и прошлых поездках, т.е. нужная "хистори".
Возможен вариант убрать FK, идущий от сущности "Маршрут" к "Гостиницы_в_туре", и при этом вручную контролировать ввод, используя триггеры/макросы, но сомневаюсь, что преподаватели меня за такое решение по голове погладят.
...
Рейтинг: 0 / 0
31.05.2011, 15:03
    #37287411
BadVodka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор структуры БД для MS SQL Serv
Собственно, подобное и заставило меня усомниться в правильности разработанной структуры.
...
Рейтинг: 0 / 0
31.05.2011, 15:36
    #37287521
П-Л
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор структуры БД для MS SQL Serv
MS SQL сервер не позволит вам иметь каскадное обновление/удаление по двум графам связей:
Города-Маршрут-Гостинницы в туре-Гостинницы

Города-Гостинницы
По одному из графов от этого придется отказаться.

Но, если этого боятся преподы из-за приверженности к высокой теории нормализации, то с точки зрения практики разработки в этом нет никакого недостатка. Автоинкрементальный счетчик делает ненужным каскадное обновление.

Каскадное удаление, как правило, опасно, потому что при ошибочном удалении записи из справочника можно грохуть целую гроздь тянущихся за ней важных наборов данных. Если удаляется случайно заведенна строка из справочника, на которую еще не повесили реальных данных, все удаляется без проблем. Если же нужно действительно уничтожить большой кусок данных, то лучше это сделать явной процедурой, обходя таблицы в правильном порядке.

Практически я чаще всего ставлю (каскадное удаление и обновление = нет), но при этом сервер прекрасно следит за нарушениями ссылочной целостности, не позволяя иметь записи, в которых FK указывают неизвстно на что.
...
Рейтинг: 0 / 0
31.05.2011, 17:31
    #37287903
BadVodka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор структуры БД для MS SQL Serv
Спасибо Вам за ваше терпение и помощь, П-Л! Буду осуществлять удаление связанных записей при помощи написанных вручную процедур. Просто где-то вычитал, что при помощи встроенных в субд функций(в данном случае каскадного удаления) процесс будет быстрее.
Возникла ещё одна проблема. Требуется хранить историю проданных договоров и гостиницы, в которых человек останавливался в определенных пунктах своего маршрута. Но и следует каким-то образом предусмотреть возможность редактирования(а именно удаления пунктов маршрута) состава действующих туров - присутствие же связанных записей в таблице "Гостиницы_в_туре" этого сделать не даст. Можно, конечно, вместо редактирования имеющегося тура каждый раз создавать новый, но это вызовет обилие повторяющихся записей, да и пользователю забивать, допустим, 15 пунктов маршрута каждый раз, когда нужно удалить всего один, будет неудобно.
...
Рейтинг: 0 / 0
31.05.2011, 17:35
    #37287912
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор структуры БД для MS SQL Serv
On 31.05.2011 18:31, BadVodka wrote:
> Спасибо Вам за ваше терпение и помощь, П-Л! Буду осуществлять удаление связанных
> записей при помощи написанных вручную процедур. Просто где-то вычитал, что при
> помощи встроенных в субд функций(в данном случае каскадного удаления) процесс
> будет быстрее.

Быстрее-то он по-всякому не будет. Что так, что эдак.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
01.06.2011, 08:30
    #37288557
П-Л
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор структуры БД для MS SQL Serv
BadVodkaВозникла ещё одна проблема. Требуется хранить историю проданных договоров и гостиницы, в которых человек останавливался в определенных пунктах своего маршрута. Но и следует каким-то образом предусмотреть возможность редактирования(а именно удаления пунктов маршрута) состава действующих туров - присутствие же связанных записей в таблице "Гостиницы_в_туре" этого сделать не даст. Можно, конечно, вместо редактирования имеющегося тура каждый раз создавать новый, но это вызовет обилие повторяющихся записей, да и пользователю забивать, допустим, 15 пунктов маршрута каждый раз, когда нужно удалить всего один, будет неудобно.

Это не проблема. Вы напрасно боитесь объемов данных. Даже персональные СУБД типа аксесс легко перевариваривают десятки и сотни тысяч записей. Структура БД тоже пока у вас более чем несложная.

Требуется хранить историю проданных договоров - Поэтому удаление пунктов маршрута - это создание нового маршрута. Редактировать имеющийся нельзя. Новый же очень легко получить сняв кальку со старого и потом поменять/добавить/удалить пару пуктов. И для базы абсолютно ненапряжно и интерфейс можно сделать удобный, чтобы решать это за считанные клики.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выбор структуры БД для MS SQL Serv / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]