У меня есть база данных туристов, состоящая из двух свя...

Автор ForumOOo (бот), 26 июля 2013, 13:20

0 Пользователи и 1 гость просматривают эту тему.

ForumOOo (бот)

Компонент: Base
Версия продукта: 4.0.x
Сборка: Apache OO
ОС: window XP

У меня есть база данных туристов, состоящая из двух связанных между
собой таблиц. Первая таблица Группы несет информацию общую о каждой
отдельно приезжающей группе (приезд, отъезд, оплата...) Вторая таблица
Туристы несет в себе персональную информацию о каждом человеке в
группе (дата рождения, паспорт и т.д.) и к какой группе они относятся.
То есть связаны эти таблицы общим полем Группы. В каждой таблице
хотела сделать ключевым полем автоматический счетчик,потому как
информация по каждому туристу и по каждой группе повторятся будет,
приезжают они не по одному разу. Но программа мне не дает так сделать.
Если в таблице Группы я выбираю ключом поле Код, то тогда не создается
связь между полем Группы(в таблице Группы) и и полем Группы (в таблице
Туристы). Связь могла создать только если ключом в таблице Группы
будет поле Группы. Но мне нужно чтобы оно не было уникальным! Второй
раз внести одну и ту же фамилию я уже не могу. Подскажите, где ошибка?

Тестовый файл: http://forumooo.ru/attachments/upload/dlya_foruma.docx (51.41 КБ)

--
Подпись: Лариса
Эл. почта: vzmorie@rambler.ru

CyberDaemon

Цитата: ForumOOo (бот) от 26 июля 2013, 13:20
Компонент: Base
Версия продукта: 4.0.x
Сборка: Apache OO
ОС: window XP

У меня есть база данных туристов, состоящая из двух связанных между
собой таблиц. Первая таблица Группы несет информацию общую о каждой
отдельно приезжающей группе (приезд, отъезд, оплата...) Вторая таблица
Туристы несет в себе персональную информацию о каждом человеке в
группе (дата рождения, паспорт и т.д.) и к какой группе они относятся.
То есть связаны эти таблицы общим полем Группы. В каждой таблице
хотела сделать ключевым полем автоматический счетчик,потому как
информация по каждому туристу и по каждой группе повторятся будет,
приезжают они не по одному разу. Но программа мне не дает так сделать.
Если в таблице Группы я выбираю ключом поле Код, то тогда не создается
связь между полем Группы(в таблице Группы) и и полем Группы (в таблице
Туристы). Связь могла создать только если ключом в таблице Группы
будет поле Группы. Но мне нужно чтобы оно не было уникальным! Второй
раз внести одну и ту же фамилию я уже не могу. Подскажите, где ошибка?

Тестовый файл: http://forumooo.ru/attachments/upload/dlya_foruma.docx (51.41 КБ)<br/><br/>--<br/>Подпись: Лариса<br/>Эл. почта: vzmorie@rambler.ru
Почему docx файл?
И пришлите нормальный файл базы, можно с парой - тройкой примеров только. Реальные данные не интересуют.

VlhOwn

У Вас типичная связь один-ко-многим.
В таблице Туристы должно присутствовать поле Группа целого типа, куда заносится (уникальный) код записи из таблицы Группы.
А в запросах, чтобы получить имя группы для какого-либо конкретного туриста, Вы будете использовать конструкции вида
select ... Группы.Имя ... from ... Группы ....
where ... Туристы.Имя='бла-бла-бла' and Группы.Код = Туристы.Группа ...

JohnSUN

Ну, насчет "один-ко-многим" , честно говоря, не уверен...
Лариса задачу описала скуповато... Но из описания вроде бы возникает предположение о связи "многие-ко-многим": каждый турист многократно может входить в разные группы.
Для реализации такой связи обычно заводят отдельную "кросс-таблицу" из трех полей: Id (просто для индексации записей), группа и код.
С нею увязывают две другие таблицы - теперь уже связями "один-ко-многим": одна запись из Группы - много записей из кросс-таблицы и одна запись из Туристы - много записей из кросс-таблицы...

Лариса, а образец базы все-таки кинь... Проще будет разговаривать
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

VlhOwn

#4
Один турист может быть членом сразу нескольких групп? Ну, разве что если в поездку едут А-Янус и У-Янус как одно лицо :)

Upd.: Я тут, безусловно, подразумеваю, что Иванов И.И., едущий в два тура подряд, - это разные люди, т.е. идентификации по персональным данным, очевидно, недостаточно.

Hasim

Цитата: VlhOwn от 26 июля 2013, 14:20Один турист может быть членом сразу нескольких групп?
Может.
Потому что он в разное время ездил в разных группах, и в таблицах это должно быть зафиксировано.
Особенность этой задачи в том, как рассматривать связи - одновременно (на период одной поездки группы) или за весь период существования тур агентства.

Лариса

Выкладываю базу.
Связь должна быть один-ко многим.
Поле Группа в таблице Группа не должно быть ключевым, т.к. Фамилии повторяются, но иначе программа не дает создать связь между таблицами.
Объясняю ситуацию: туристы приезжают групой, из которой один человек как бы контактное лицо, на его фамилию мы ориентируемся: Группа Иванова приезжает такого то числа, группа Иванова оплатила тур и т.д. Некоторые приезжают не один раз. Состав может меняться, но контактное лицо как правило не меняется - это уже наш постоянный клиент. Проблема в том, чтоя не могу сделать поле Группа/Группы не ключевым, иначе не создается связь между таблицами

[вложение удалено Администратором]

CyberDaemon

Цитата: Лариса от 26 июля 2013, 16:14
Выкладываю базу.
Связь должна быть один-ко многим.
Поле Группа в таблице Группа не должно быть ключевым, т.к. Фамилии повторяются, но иначе программа не дает создать связь между таблицами.
Объясняю ситуацию: туристы приезжают групой, из которой один человек как бы контактное лицо, на его фамилию мы ориентируемся: Группа Иванова приезжает такого то числа, группа Иванова оплатила тур и т.д. Некоторые приезжают не один раз. Состав может меняться, но контактное лицо как правило не меняется - это уже наш постоянный клиент. Проблема в том, чтоя не могу сделать поле Группа/Группы не ключевым, иначе не создается связь между таблицами
То есть группа - это не название(условное обозначение) группы, а фамилия контактного лица, так?

Лариса

Да,это фамилия контактного лица, ну как бы название группы. И он тоже входит в состав группы

CyberDaemon

Цитата: Лариса от 26 июля 2013, 16:41
Да,это фамилия контактного лица, ну как бы название группы. И он тоже входит в состав группы
А что, если "группа" сделать числовой и уникальной, Group_ID например. 2-х групп с одинаковым ID не надо?
А контактное лицо привязать к Group_ID отдельную таблицу.
Group_ID -> контакное_лицо.
Для запросов применять Group_ID, а для вывода контактного лица уже амилию из таблицы.

VlhOwn

Лариса,
Вам нужно сделать некий ключевой агрегат, который будет однозначно идентифицировать группу.
Например, это может быть фамилия контактного лица, срок тура, место назначения. Это будет таблица Группы. Выглядеть она будет, например, так:
1 Иванов 1.1.13 Турция
2 Петров 1.1.13 Египет
3 Иванов 10.3.13 Гадюкино
...
Ключевым полем в ней является номер записи, понятно, что он уникальный.
Далее, остальных членов групп Вы вносите в таблицу, например, Туристы, в которой всего три поля: ключ, ФИО, номер группы из таблицы Группы. Тем самым Вы однозначно связываете туристов с группами. Все остальные данные - это другие таблицы, привязанные либо к ключу группы, если это инфв о группе, либо к ключу туриста, если это персональная информация.

Лариса


Лариса

Добрый вечер! Создала я новую структуру своей базы. Пользовалась советом
VlhOwn Ветеран. Правильно ли я сделала?

[вложение удалено Администратором]

VlhOwn

Здравствуйте, Лариса Новичок!
(Представляю, какое изумление вызовет у Вас последовательная смена фамилии на Старожил, Ветеран и, чем черт не шутит, Гуру!)

Вы сделали правильно, но не совсем:

1). Таблицы 1 и 4 содержат дублирующуюся информацию о заезде - это избыточно и ОЧЕНЬ неудобно: придется следить за тем, чтобы она была одинакова. Может быть Таблицу 1 убрать вовсе (при этом код группы в Таблице 4 нужно сделать автополем, а сама таблица будет тем самым вожделенным списком групп)?

2). Вы говорили, что идентифицируете группы по фамилии контактного лица. Я правильно понимаю, что это лицо - тоже турист и будет присутствовать в таблице 2? Тогда, может быть, в таблице 4 завести еще поле "руководитель", которое будет ссылаться на таблицу 2? Ваши группы тогда будут идентифицироваться привычным для Вас образом:
  1  Иванов  1.1.13  15.1.13  самолет
2  Петрова  3.1.13  20.1.13  ступа

Заодно это позволит различать группы с одинаковыми сроками заезда/выезда.

3). Раньше у Вас была еще какая-то финансовая информация - оплатил/не оплатил и т.п. Теперь я ее не вижу, но, возможно, это из разряда "дураку полработы не показывают".

[любопытство]
1. Ни в Вашем предыдущем проекте, ни в этом я не увидел информацию о том, куда едет группа. Они у Вас все в одно место едут или Вам это фиолетово? Или Вы и есть то самое место?
2. Вы, когда закончите делать базу, намерены использовать ее на одном рабочем месте или на нескольких одновременно?
[/любопытство]

Hasim

Следовало бы обратить внимание на совет JohnSUN.
Вот так, например:


[вложение удалено Администратором]