Как сделать присоединение аннотации JoinTable - PullRequest
0 голосов
/ 22 августа 2009

У меня вопрос по дизайну / программированию. Сначала я хочу спросить, хорош ли мой дизайн, а затем я хочу знать, как это сделать.

Я хочу иметь страницу i18n, которая может иметь или не иметь перевод. например Страница A имеет английский и японский языки, а страница B может иметь только английский

Это макет БД

page
----
id int
topic varchar(128)
content varchar(1024)

page_l10n
---------
id int fk
topic varchar(128)
content varchar(1024)
locale_id int fk

locale
------
id int
name varchar(8)

Чтобы выбрать, я делаю что-то вроде этого

SELECT
    COALESCE (hl.topic,h.topic) , COALESCE(hl.content, h.content)
    FROM page h 
    LEFT JOIN (page_l10n hl, `locale` l) ON (h.id=hl.id AND l.id=hl.locale_id) AND l.locale = 'ja_JP'

Итак, мой вопрос: если это нормальный макет БД (или вы, ребята, предлагаете использовать только 2 таблицы и иметь локаль в качестве столбца в таблице страниц? сделать мою модель (POJO)?

Я использую JPA для отображения R / O и спящий режим для соединения с БД.

Пожалуйста, сообщите Заранее спасибо ~

1 Ответ

1 голос
/ 22 августа 2009

Я предполагаю, что ваш контент динамический (например, предоставлен / изменен конечными пользователями). Если это не так, вы можете вместо этого взглянуть на комплектов ресурсов .

Трудно критиковать структуру базы данных, не понимая, чего вы пытаетесь достичь, и вы предоставили очень мало описания. Но, предполагая, что topic и content являются единственными атрибутами, которые будут иметь ваши страницы, и их необходимо локализовать, я бы предложил следующее:

1) id столбец таблицы page выглядит как суррогатный ключ (так как он имеет тип int), что хорошо, если на него ссылаются из какой-то другой таблицы. Однако, если вы собираетесь получать содержимое страницы напрямую, вам нужен какой-то способ обращения к страницам без необходимости жесткого кодирования их идентификаторов (что я имею в виду, если мне нужно получить контент для some/path/pageA.html, как я узнаю, что должен ищите страницу с ID = 173?) Поэтому, если это так, вы можете также сохранить естественный ключ в этой таблице.

2) Я не уверен, что вам нужны столбцы topic и content в таблице page; почему бы не сохранить их в page_l10n для соответствующей локали? Бывают случаи, когда их можно хранить в таблице page, но я не думаю, что вы один из них.

3) Наличие отдельной таблицы locale может иметь смысл, если вы хотите поддерживать переводы только в ограниченное подмножество локалей в отличие от всех доступных локалей.

Что касается отображения, аннотация JoinTable в основном используется для отображения многих ко многим или (несколько необычно) однонаправленного отображения один ко многим; оба они не применимы в вашем случае. Вам понадобится простая коллекция , управляемая с конца ребенка. Что-то вроде:

// in your Page class
@OneToMany(mappedBy="page")
public List<PageLocalization> getPageLocalizations() {

// in your PageLocalization class
@ManyToOne
public Page getPage() {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...