При работе с инструментами моделирования баз данных, способными генерировать код, существуют определенные типы отношений, которые (почти?) Никогда не поддерживаются.Проблемы с нулевым или однозадачным или одним отношением
К ним относятся 1-к-1, многие-ко-многим и 0 или 1-к-0 или 1. 1: 1, : и 0..1: 0..1.
Первые два имеют простые решения.
1-к-1 может быть решена путем преобразования в 0..1-к-1 или 1-к-0..1, 0..1: 1 или 1: 0..1.
многие-ко-многим может быть решена с помощью таблицы в середине отношений, а затем либо 1: * и : 1 или 0..1: и *: 0 .. 1 или некоторые аналогичные комбинации. Я думаю, что есть четыре возможные комбинации, которые разрешают это.
Однако я застрял на 0..1-to-0..1. На самом деле, у меня есть такой набор таблиц, которые, похоже, имеют эти логические отношения.
В моем случае у меня есть четыре стола. Для аргумента предположим, что все они имеют первичные ключи типа INT. Таблицы - это люди, организации, клиенты и сотрудники.
Слово о логике. Организации могут иметь людей, их называют «Контакты» в отношениях. Люди могут быть либо Клиентом, либо Работником, либо и тем, и другим.
Организации < -> есть Контакты < -> as People. Это отношение 0..1: *. Это означает, что Человек может существовать с Организацией или без нее и что у Организации может быть много людей (или нет).
Сотрудник должен иметь запись человека, и это отношение имеет смысл. Это отношение 0..1: 1, когда у Работника должно быть Лицо, но у Лица может быть 0 или 1 запись сотрудника.
Но это не имеет смысла, поскольку наследование сущности движется в обоих направлениях логически. В случае Людей или организаций Клиенту. Клиент может быть либо Организацией, либо Лицом, но не обоими, а выбор производится через поле «Тип». Точно так же лицо не обязательно является Клиентом, это может быть Сотрудник или какой-либо другой тип контакта позже. Я не могу требовать, чтобы Лицо было Клиентом, и я не могу требовать, чтобы Клиент был Лицом. Точно так же я не могу требовать, чтобы Организация была Клиентом, и я не могу требовать от Клиента быть Организацией. Таким образом, необратимость наследования также необходима. В случае как Клиента: Лица и Заказчика: Организация, им необходимо реализовать 0..1: 0..1 и 0..1: 0..1. Но языковые инструменты не поддерживают его. Поскольку они являются строго типизированными языками, наследование объектов может протекать только в одном направлении. Даже на слабо типизированных языках вы все равно приходили бы в ситуацию, которая была первой: курица или яйцо.
JavaScript, возможно, подходит для этого случая, поскольку вы можете динамически изменять структуру типа объекта, и вы всегда можете объединить две структуры в любом порядке, даже если вы не могли явно объявить объект в этом манера.
Но мой инструмент на сегодня - это Microsoft LightSwitch, и он не сделает этого вообще. Я не думаю, что существует современный инструмент моделирования, который будет генерировать и набирать строго типизированный код языка, который позволит этот тип отношения.
Есть ли трюк, который преодолевает это отношение, 0..1: 0..1, или есть что-то фундаментальное, что я еще не понял? Я остаюсь здесь, чтобы выбрать сторону, и я не знаю, какая сторона выигрывает: Клиент или Лицо, Клиент или Организация. Но, возможно, есть что-то еще, что я могу сделать, не ставя под угрозу любой случай. Есть что-то в том, что нарушена модель?
Спасибо!