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