EDIT
Если одно изображение когда-либо принадлежит только одной из двадцати таблиц, этот дизайн может работать:
People (PersonId, Name)
Places (PlaceId, Name)
Dogs (DogId, Breed)
Doors (DoorId, Height, Width)
Images (ImageId, ImageBinary, OwnerId, OwnerTable)
Где OwnerTable - это имя или код таблицы, которой принадлежит OwnerId.
Это сэкономит вам 20 FK в таблице изображений или 20 таблиц ассоциаций. Затем в соединениях вы должны указать OwnerTable в зависимости от таблицы, к которой вы присоединяетесь.
Вам потребуется использовать конвертируемые типы для идентификаторов (например, TINYINT, SMALLINT и INT), и, предпочтительно, один тип для всех (например, INT), и вам придется самостоятельно управлять ссылочной целостностью через триггеры или другие код.
/ EDIT
Вам нужно 5 таблиц, а не 3:
People (PersonId, Name)
Places (PlaceId, Name)
Images (ImageId, ImageBinary)
ImagesPeople (ImageId, PersonId)
ImagesPlaces (ImageId, PlaceId)
Вы можете называть поля как хотите. People.Id, ImagesPeople.PersonId и т. Д.
Но то, что вы не можете сделать, это что-то вроде этого:
People (PersonId, Name)
Places (PlaceId, Name)
Images (ImageId, ImageBinary, PlaceOrPersonId)
Ну, вы можете, но база данных не поможет вам навязать отношения или сказать, к какой таблице принадлежит FK. Как бы вы узнали? Есть хакерские обходные пути, такие как пошаговое увеличение идентификатора, добавление столбца типа к изображениям или использование идентификаторов GUID.
В качестве альтернативы:
Things (ThingId PK, Type)
People (ThingId PK/FK, Name, Age)
Places (ThingId PK/FK, Name, LatLon)
Images (ImageId PK, ImageBinary, ThingId FK)
Вы также можете сделать изображения "вещью". Иногда вы видите такие проекты. Это дает вам ссылочную целостность, но не исключительность типа. Вы можете иметь тот же ThingId в Люди, Места и Изображения, и база данных не будет заботиться. Вы должны были бы закодировать это правило самостоятельно.
Редактировать: по предложению Кайлона, сценарий 4:
People (PersonId, Name)
Places (PlaceId, Name)
PeopleImages (PeopleImageId, ImageBinary)
PlaceImages (PlaceImageId, ImageBinary)
Здесь изображения принадлежат исключительно одному человеку или месту. Аналогично версии 2, но с объявленными внешними ключами. Это может иметь некоторые преимущества в производительности по сравнению с 5 таблицами, поскольку требуется меньше соединений. Вы теряете «Изображение» как отдельную сущность, заменяемую «PeopleImage» и «PlaceImage».