У меня есть один вопрос о структуре базы данных при использовании hibernate.
Я должен сохранять информацию (одно число) каждый день в базе данных.Очень часто мне нужно выбирать информацию за целый месяц.
Когда у меня есть таблица с (дата, информация), мне нужно сделать до 31 выбора, чтобы получить данные за один месяц.Поскольку я делаю это очень часто, это вызывает нагрузку на базу данных.
Теперь я подумал о том, чтобы записать всю информацию (31 число) в таблицу MONTH с колонкой «месяц» и другой колонкой «информация», гдеЯ вставил все числа, разделенные знаком «;».Тогда мне нужно будет сделать только один выбор.Но мне нужно было бы разделить шнур данных, чтобы получить числа (разделенные в каждом ";").
Так что, возможно, другим решением будет таблица MONTH с 32 столбцами (месяц и 1).до 31).столбцы с 1 по 31 будут крошечными, и я буду хранить в них числа.Мне нужно было сделать один выбор, чтобы получать данные за каждый месяц, и мне не пришлось бы разбивать шнур данных, но я мог бы запрашивать данные по столбцу (я использую hibernate)
Имеет ли это последнее решение какие-либо недостатки, которые яне думал о?:-) Вы бы порекомендовали другое решение?
[ПРАВИТЬ] Спасибо за вашу помощь.Раньше это была структура данных:
create table CLIENTS_DATA (
client_id int UNSIGNED NOT NULL,
datum date NOT NULL,
information tinyint UNSIGNED NOT NULL default 0,
** additional informations **
primary key(client_id, datum),
foreign key(client_id) references clients(id) ON DELETE CASCADE ON UPDATE CASCADE)
ENGINE=InnoDB;
, и здесь я теперь храню информацию за целый месяц в:
create table CLIENTS_MONTHLY_INFORMATIONS (
client_id int UNSIGNED NOT NULL,
datum date NOT NULL,
i1 tinyint NOT NULL default 0,
i2 tinyint NOT NULL default 0,
i3 tinyint NOT NULL default 0,
i4 tinyint NOT NULL default 0,
i5 tinyint NOT NULL default 0,
i6 tinyint NOT NULL default 0,
i7 tinyint NOT NULL default 0,
i8 tinyint NOT NULL default 0,
i9 tinyint NOT NULL default 0,
i10 tinyint NOT NULL default 0,
i11 tinyint NOT NULL default 0,
i12 tinyint NOT NULL default 0,
i13 tinyint NOT NULL default 0,
i14 tinyint NOT NULL default 0,
i15 tinyint NOT NULL default 0,
i16 tinyint NOT NULL default 0,
i17 tinyint NOT NULL default 0,
i18 tinyint NOT NULL default 0,
i19 tinyint NOT NULL default 0,
i20 tinyint NOT NULL default 0,
i21 tinyint NOT NULL default 0,
i22 tinyint NOT NULL default 0,
i23 tinyint NOT NULL default 0,
i24 tinyint NOT NULL default 0,
i25 tinyint NOT NULL default 0,
i26 tinyint NOT NULL default 0,
i27 tinyint NOT NULL default 0,
i28 tinyint NOT NULL default 0,
i29 tinyint NOT NULL default 0,
i30 tinyint NOT NULL default 0,
i31 tinyint NOT NULL default 0,
average float UNSIGNED,
primary key(client_id, datum),
foreign key(client_id) references clients(id) ON DELETE CASCADE ON UPDATE CASCADE)
ENGINE=InnoDB;
запрос для второй таблицы будет:
public ClientsMonthlyInformations getClientsMonthlyInformationsByIdAndDate(int uid, Date datum) {
ClientsMonthlyInformations cmi = (ClientsMonthlyInformations) this.sessionFactory.getCurrentSession().createQuery("from ClientsMonthlyInformations clientsmonthlyinformations where clientsmonthlyinformations.clients.id=:clientsid and clientsmonthlyinformations.datum=:date").setParameter("clientsid", uid).setParameter("date", datum).uniqueResult();
return cmi;
}
для получения данных из первой таблицы я использую ту же запись, но, конечно, ClientsData вместо ClientsMonthlyInformation.Вы правы, я мог бы создать запрос, чтобы получить 31-Datarecords, что означает 31 Hibernate-Objects.Я не знаю, почему я думал, что было бы плохо делать один выбор из 31 строки, чтобы получить 31 объект.