Последствия супертипа и подтипа - PullRequest
0 голосов
/ 24 февраля 2012

Это плохо для реализации супертипа и подтипа для всех данных в базе данных? Мне нужно несколько советов по этому вопросу, прежде чем двигаться в этом направлении ...

Например,

У меня есть эти таблицы как объекты, и они связаны,

users
pages
images

entities таблица в качестве супертипа

entity_id     entity_type
1             page
2             page
3             user
4             user
5             image
6             image

users таблица

user_id     entity_id
1           3
2           4

pages таблица

page_id     entity_id
1           1
2           2

images стол

image_id     entity_id
1            5
2            6

вот таблица map images таблица с таблицей entities, потому что некоторые изображения принадлежат определенной странице (возможно, в блоге и т. Д. В будущем),

map_entity_image стол

entity_id    image_id
1            1
1            2

Итак, я вставлю строку в таблицу entities, когда у меня будет страница, изображение, пользователь и т. Д., Которые нужно создать.

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

В конце концов, это плохая структура?

или, может быть, я неправильно делаю супертип / подтип?

редактирование:

Я думаю, что entity должен иметь только эти данные,

entity_id     entity_type
1             page
2             page

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

entity_id     entity_type
1             page
2             page
3             user
4             user

возможно я ошибаюсь ...

EDIT:

так что это запрос, как я узнаю, сколько изображений прикреплено к идентификатору страницы 1,

SELECT E.*, P.*, X.*,C.*
FROM entities E

LEFT JOIN pages P ON (P.entity_id = E.entity_id)

LEFT JOIN map_entities_images X ON (X.entity_id = E.entity_id)

LEFT JOIN images C ON (C.image_id = X.image_id)
WHERE P.page_id = 1

возвращает 2 изображений.

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Если все, что вам нужно, это прикреплять изображения к пользователям и страницам, я не уверен, что иерархия полноценных категорий («субкласс», «подтип», «наследование») будет оптимальной.

Предполагается, что страницы / пользователи могут иметь несколько изображений, и любое данное изображение может быть прикреплено к нескольким страницам / пользователям, и если вы не хотите прикреплять изображения к изображениям, ваша модель должна выглядеть примерно так:

enter image description here


Вы могли бы использовать иерархию категорий для достижения аналогичного результата ...

enter image description here

... нос таким количеством подклассов, которые я бы порекомендовал против него (из-за потенциальных проблем с ремонтопригодностью и производительностью).С другой стороны, если есть потенциал для добавления новых подклассов в будущем, это может быть правильным решением (ENTITY_IMAGE автоматически «покроет» все эти новые подклассы, поэтому вам не нужно вводить новую «ссылку»).таблица для каждого из них).

Кстати, есть 3 основных способа для реализации иерархии категорий, каждый со своим собственным набором компромиссов.

0 голосов
/ 24 февраля 2012

Не совсем ответ на ваш вопрос, но то, что вы описываете, совсем не то, что большинство разработчиков назвали бы «супертипом».

Это аналог супер / подклассов в ООП. Супертип является родовой сущностью, а подтип является более специализированной версией родовой сущности

Классический пример - автомобили. «Транспортное средство» имеет общий набор атрибутов, таких как «владелец», «цена», «марка», «модель». Неважно, машина это, велосипед или лодка. Однако у автомобилей есть «колеса», «двери», «размер двигателя» и «тип двигателя», у велосипедов - «число передач» и «тип местности» (BMX, дорога и т. Д.), А у лодок - «пропеллеры». , "паруса" и "каюты".

Есть два способа реализации этого.

Во-первых, есть «свертка», у вас есть одна таблица, которая содержит все общие атрибуты для «транспортного средства» плюс дополнительные атрибуты для каждого типа транспортного средства.

Во-вторых, есть «сворачивание», у вас есть одна таблица, которая содержит только общие атрибуты для каждого транспортного средства. И одна таблица для каждого типа транспортного средства для хранения атрибутов, характерных для «автомобилей», «велосипедов» и «лодок».

...