• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Access база адресов

  • Автор темы ioni
  • Дата начала
I

ioni

У меня вопрос, наверняка просто глупый.
Но я хочу сохранить цельность данных и никак не могу придумать, как это сделать.

Итак: адреса:
Есть Компания, у нее может быть Адрес (например, адрес регистрации).
Есть Сотрудник, у него может быть Адрес (напрмиер, отличающийся от адреса Компании, к которой он относится)

Могу ли я создать структуру в MS Access, в которой существуют связанные поля в таблице Адрес, соответсвующие или Сотруднику или Компании (это разные таблицы)?
 
I

ioni

Я хочу сделать связанные поля, consistent data чтобы была.
То есть данные обновлялись при удалении, изменении и так далее.

Добавлено: Или не морочить голову и сделать адрес частью профиля компании и профиля сотрудника?
 
I

ioni

Я попробую еще раз объяснить.

В MS Access я пытаюсь сделать систему контактной информации. У меня есть две таблицы – Компании и Сотрудники. Следуя логике, одинаковая информация должна храниться отдельно. Другими словами Адрес необходимо вынести в отдельную таблицу, я полагаю.

Так как Адрес может быть свойством как Компании, так и Сотрудника (и они могут различаться для Сотрудников одной и той же Компании), то а таблице Адреса могут быть поля, относящиеся к таблице Сотрудник, а могу быть поля, относящиеся к Компании.

Само по себе это не сложно сделать – однако я хочу озабочен цельностью данных. Еслия удаляю запись в таблице Сотрудник, я хочу, что его Адрес так же был удален. То же самое касается и Компании. Удаляя Компанию я хочу быть уваерен, что в таблице Адрес не останется записей «без родителя».

Как мне это сделать средствами самого MS Access? Как мне обеспечить цельность данных?
 
I

ioni

Я, наверное, как-то не так мысль выражаю

Одной записи в таблице Компания может соответсоввать несколько записей в таблице Адрес.
Одной записи в таблице Сотрудник может соответсоввать несколько записей в таблице Адрес.

Как обеспечить цельность данных средствами БД?
 
N

Nulex

Я, наверное, как-то не так мысль выражаю

Одной записи в таблице Компания может соответсоввать несколько записей в таблице Адрес.
Одной записи в таблице Сотрудник может соответсоввать несколько записей в таблице Адрес.

Как обеспечить цельность данных средствами БД?

Тут вы описали классическую схему многие ко многим. Проще всего обеспечить целостность данных, поставив соответствующие флажки в свойствах связи, но не думаю что каскадное удаление будет хорошим решением, наоборот его использовать нельзя не в коем случае. Можно написать функцию которая при загрузке будет проверять сиротливые адреса и удалять их нафиг. Еще нужно не забыть, что если структура разветвленная то менять направление один ко многим можно только один раз в цепочке иначе все пропало :D
 
I

ioni

Типа, код адреса хранить в таблице сотрудник или компания?
 
I

ioni

Это связи между двумя таблицами.
У меня же связь один-ко-многим между Компания-Адрес
и один-ко-многим между Сотрудник-Адрес

В 2010 Access есть возможность припысывать логику (пока у меня именно так) - при удалении записи в Компании (или в Сотруднике) проверяется таблица Адрес на наличие связанного поля и удаляется (если есть)

Поле связи в формате кода репликации, по понятным причинам.

Может быть, есть обходные пути?
 
N

Nulex

Могу ли я создать структуру в MS Access, в которой существуют связанные поля в таблице Адрес, соответсвующие или Сотруднику или Компании (это разные таблицы)?

Конечно можете но зачем?

Это связи между двумя таблицами.
У меня же связь один-ко-многим между Компания-Адрес
и один-ко-многим между Сотрудник-Адрес

Получается в компании могут работать много сотрудников и один сотрудник может работать во многих компаниях. ;) Но это в качестве бреда.

Можно кардинально решить проблему вообще не используя связей. И пройдя семь кругов ADO замутить то что вы хотите. Все опять упирается в целесообразность. Постройте таблицу адреса так чтоб ни один сотрудник не мог иметь адреса занятого другим сотрудником или компаний (соответственно и для компании) и спокойно каскадно удаляйте адреса но смысл в этом минимальный если вспомнить причину по которой гордился огород если подходиь так то уж лучше две таблицы адреса_компаний и адреса_сотрудников.

Добавлено:
Тут ее и близко нет.
ioni

Ну по формальному то признаку есть :KillMe: между сотрудниками и компаниями через адреса
 
I

ioni

Я ни в коем слдучае не партизаню

Задача именно такая. как я ее описал.
Причина. по которой использованы три таблицы - потому что Адрес по своей сути обладает одними и теми же признаками. есть две строчки адреса, город, область, индекс, страна. И дублировать структуру смысла нет - если можно хранить ключ связи в таблице (то есть связать адрес с сотрдуником и адрес с компанией)

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

так что совпадение адреса - редкое исключение. а не правило - а значит и многое-мо-многим не имеет места.

Я не вижу, как можно сделать каскадное обновление, когда в ключевом поле Адреса может быть не ID сотрудника а Компании - то есть нарушается цельность данных (каждой записи в "Сотруднике" соответствует одна или несколько записей в "Адресе" - и что делать с записями, относящимися к "Компании"? Они не подпадают под правило о цельности данных, озвученное в отношении связей с таблицей Сотрдуник).

Вот я и пытаюсь найти способ. Знаете как - покажите руками, приложите файл. У меня задать цельность данных не получается.
 
N

Nulex

Я ни в коем слдучае не партизаню

Вот я и пытаюсь найти способ. Знаете как - покажите руками, приложите файл. У меня задать цельность данных не получается.

Короче, если без дураков, то тут без 4 таблицы не обойтись. Необходимо будет реализовать две связи многие-ко-многим. И провести несколько часов пытаясь понять не намудрил ли я что то с ключами. Короче кидаю пример разбирайтесь...

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

Вложения

  • ___________Microsoft_Office_Access.mdb.zip
    14 КБ · Просмотры: 250
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!