Hibernate: добавление объекта, если его еще нет - PullRequest
0 голосов
/ 09 октября 2011

Вот случай: я создаю пакетный скрипт, который запускается ежедневно, разбирает лог-файлы и экспортирует данные в базу данных. Формат этого файла в основном

std_prop1;std_prop2;std_prop3;[opt_prop1;[opt_prop2;[opt_prop3;[..]]]

Стандартные свойства отображаются в таблицу со столбцом для каждого свойства, где каждая строка в файле журнала в основном сопоставляется с соответствующей строкой. Это может выглядеть как LOGDATA(id,timestamp,systemId,methodName,callLenght). Поскольку мы должны иметь возможность регистрировать столько необязательных свойств, сколько нам нужно, мы не можем сопоставить их с одной и той же таблицей, поскольку это будет означать добавление строки в таблицу каждый раз, когда вводится новое свойство. Не думать о количестве NULL ссылок ...

Таким образом, дополнительные свойства помещаются в другую таблицу, скажем, EXTRA_PROPS(logdata_foreign_key,propname,value). В действительности, большинство необязательных свойств одинаковы (например, версия os, контейнер приложения и т. Д.), Что делает несколько расточительным запись, например, 4 строк в EXTRA_PROPS для каждой строки в LOGDATA (в случае, если в среднем на одну добавлено 4 свойства). Так что я хотел бы, чтобы моя пакетная работа была

for each additionalProperty in logRow:
  see if additionalProperty already exist
  if exists:
    create a reference to it in a reference table
  if not:
    add the property to the extra properties table
    create a reference to it in a reference table

Тогда я бы, вероятно, имел три слегка отличающиеся таблицы:

LOGDATA(id,timestamp,systemId,methodName,callLenght)
EXTRA_PROPS(id,propname,value)
LOGDATA_HAS_EXTRA_PROPS(logid,extra_prop_id)

Я не на 100%, это лучший способ сделать это, я все равно создал бы N строк в таблице LOGDATA_HAS_EXTRA_PROPS для N свойств, но, по крайней мере, я бы не добавил новые строки в EXTRA_PROPS.

Даже если это не самый лучший способ (что?), Я все еще задаюсь вопросом о технической стороне: как бы я реализовал это, используя Hibernate? Он не должен быть сверхбыстрым, но он должен пережевать 100K + строк.

1 Ответ

1 голос
/ 09 октября 2011

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

С точки зрения моделирования данных мне кажется, что (propname,value) на самом деле является первичным ключом в EXTRA_PROPS.По сути, вы хотите выразить логику, что, например, комбинация hostname + foo.bar.com появится только один раз в таблице.Я прав?Это было бы PK.Так что вам нужно будет использовать это в LOGDATA_HAS_EXTRA_PROPS.Использование только name будет недостаточным для справки.

В Hibernate (если вы решите его использовать) это можно выразить с помощью составного ключа, используя @EmbeddedId или Embeddable для объекта, сопоставленного с EXTRA_PROPS.И тогда вы можете иметь отношения многие ко многим, которые используют LOGDATA_HAS_EXTRA_PROPS в качестве таблицы ассоциации.

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