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

Тема в разделе "Остальные БД", создана пользователем ioni, 25 мар 2010.

  1. ioni

    ioni Well-Known Member

    Регистрация:
    11 май 2006
    Сообщения:
    351
    Симпатии:
    0
    У меня вопрос, наверняка просто глупый.
    Но я хочу сохранить цельность данных и никак не могу придумать, как это сделать.

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

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

    ioni Well-Known Member

    Регистрация:
    11 май 2006
    Сообщения:
    351
    Симпатии:
    0
    Я хочу сделать связанные поля, consistent data чтобы была.
    То есть данные обновлялись при удалении, изменении и так далее.

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

    ioni Well-Known Member

    Регистрация:
    11 май 2006
    Сообщения:
    351
    Симпатии:
    0
    Я попробую еще раз объяснить.

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

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

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

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

    ioni Well-Known Member

    Регистрация:
    11 май 2006
    Сообщения:
    351
    Симпатии:
    0
    Я, наверное, как-то не так мысль выражаю

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

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

    Nulex Гость

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

    ioni Well-Known Member

    Регистрация:
    11 май 2006
    Сообщения:
    351
    Симпатии:
    0
    Нарушение цельности данных
     
  7. ioni

    ioni Well-Known Member

    Регистрация:
    11 май 2006
    Сообщения:
    351
    Симпатии:
    0
    Типа, код адреса хранить в таблице сотрудник или компания?
     
  8. ioni

    ioni Well-Known Member

    Регистрация:
    11 май 2006
    Сообщения:
    351
    Симпатии:
    0
    Это связи между двумя таблицами.
    У меня же связь один-ко-многим между Компания-Адрес
    и один-ко-многим между Сотрудник-Адрес

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

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

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

    Nulex Гость

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

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

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

    Добавлено:
    Ну по формальному то признаку есть :KillMe: между сотрудниками и компаниями через адреса
     
  10. ioni

    ioni Well-Known Member

    Регистрация:
    11 май 2006
    Сообщения:
    351
    Симпатии:
    0
    Я ни в коем слдучае не партизаню

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

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

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

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

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

    Nulex Гость

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

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

    Вложения:

Загрузка...

Поделиться этой страницей