2011-02-05 2 views
1

EDIT: Изменено название из «наследования» в «состав». Левая часть вопроса не изменилась.Есть ли ORM, который поддерживает композицию без соединения

Мне любопытно, есть ли инструмент ORM, который поддерживает наследование без создания отдельных таблиц, которые необходимо объединить.

Простой пример. Предположим, что таблица клиентов, с адресом Bill-to и таблицей поставщиков, имеет адрес для перевода. Держите его простым и принимайте по одному адресу каждый, а не дочернюю таблицу адресов для каждого.

Эти адреса будут иметь несколько общих значений: адрес 1, адрес 2, город, штат/провинцию, почтовый индекс. Итак, допустим, у меня будет класс «addressBlock», и я хочу, чтобы клиенты и поставщики наследовали этот класс и, возможно, другие классы. Но мне не нужны отдельные таблицы, которые должны быть объединены, я хочу, чтобы столбцы в таблицах клиентов и поставщиков соответственно.

Есть ли ORM, который поддерживает это?

Ближайший вопрос, который я нашел в StackOverflow, который может быть одним и тем же вопросом, приведен ниже, но я не могу точно понять, спрашивает ли OP, что я спрашиваю. Кажется, он спрашивает о наследовании наследования именно потому, что будет много таблиц. Я ищу случай, когда вы можете использовать наследование без генерации нескольких таблиц.

Model inheritance approach with Django's ORM

+0

Я сразу же подумал, что вы используете наследование, где вы действительно должны использовать композицию. – btilly

+0

Что именно вы боитесь, с тем, что адрес был нормализован в отдельную таблицу адресов, почему вы ** не хотите этого **. Характер баз данных - это множество небольших таблиц, SQL предназначен для соединений. – PerformanceDBA

ответ

4

JPA (Java Persistence API, реализуемый Hibernate, EclipseLink и другие) поддерживает это: Вы бы определить адреса POJO, пометить его как "встраиваемый", и есть две сущности (клиентов и поставщиков), имеющий каждое поле типа Address (помечено как «встроенное»). Поля адреса клиента будут сопоставлены столбцам в таблице Customer, а поля адреса поставщика будут сопоставлены столбцам в таблице Vendor.

Обратите внимание, что здесь нет наследования. Наследование для - это отношения. Поставщик не является адресом, и клиент также не является адресом. Однако есть состав, потому что у продавца есть адрес, а у клиента есть адрес.

+0

+1 для прямого ответа :) –

+0

Я не понимаю вашего ответа, если «внедренный адрес» содержит коллекцию столбцов или только один столбец. Другими словами, вы определяете коллекцию и вставляете ее один раз или вы должны вставлять каждый столбец? –

+0

Вложенный адрес содержит столько полей, сколько вы хотите, каждый из которых сопоставляется с собственным столбцом. Сам адрес содержит отображение полей в столбцы, но каждый раз, когда адрес фактически внедряется, объект внедрения (например, Клиент или поставщик) может свободно настраивать сопоставление. См. Http://www.java2s.com/Tutorial/Java/0355__JPA/ShareEmbeddableEntity.htm для примера. –

Смежные вопросы