#php #mysql
#php #mysql
Вопрос:
Я настраиваюсь на сбор статистики за долгое время. Это будет записано небольшими блоками, которые я планирую поместить все в одно текстовое поле, последние первыми .. вроде этого
[date:03.01.2016,data][date:02.01.2016,data][date:01.01.2016,data]...
это будет происходить чаще (просто образец), но должно оставаться достаточно маленьким, чтобы вести запись десятилетиями, и в то же время достаточно большим, чтобы я захотел его оптимизировать.
Я ищу 2 вещи
- Можете ли вы добавить перед полем в mysql?
- Можете ли вы частично прочитать поле, например, только первые 100 символов?
Блоки будут фиксированной длины, чтобы я мог точно оценить, сколько символов мне нужно загрузить, чтобы отобразить статистику за X период времени.
Комментарии:
1. Это звучит как плохая идея во многих отношениях. Во-первых, если вы действительно планируете добавлять тысячи или более таких временных меток, то вы могли бы легко превысить пробел в столбце. Кроме того, хотя можно имитировать добавление путем обновления старого значения, это тоже не так приятно. Лучшим вариантом было бы поместить каждый токен временной метки в свою собственную запись .
2. Когда кто-то попросит вас получить статистику за какой-то период — что вы будете делать? Выполнить синтаксический анализ sting?
3. как вы думаете, оказываете ли вы какие-либо услуги серверу, пользователю и хранилищу, делая это?
Ответ №1:
Ответ на ваши два вопроса «да»:
update t
set field = concat($newval, field)
where id = $id;
И:
select left(field, 100)
from t
where id = $id;
(Предполагается, что у вас есть несколько строк в таблице.)
Тем не менее, ваш метод хранения данных абсолютно не подходит для использования в реляционной базе данных.
Предположительно, вам нужна таблица, которая выглядит примерно так:
create table t (
tId int auto_increment primary key,
creationDate date,
data <something>
);
(Это может быть сложнее, если data
должно быть несколько столбцов.)
Затем вы вставляете в таблицу:
insert into t(createDate, data)
select $date, $data;
И вы можете извлечь самую последнюю строку:
select t.*
from t
order by tId desc
limit 1;
Все это просто примеры, потому что ваш вопрос не дает полной картины данных.
Комментарии:
1. Гордон прав. Помещение большого количества объединенных данных в
TEXT
поле в RDMS похоже на использование молотка для закручивания шурупов в вашей новой мебели. Это создаст беспорядок, и ваша мебель развалится, как только вы начнете ее использовать.2. это немного сложнее, чем то, что я собираю данные о тысячах различных объектов (которые являются строками в таблице), и, учитывая, что статистика будет иметь смысл только в контексте объекта, я решил, что вставить их в объект в виде поля было бы быстрее и в целом эффективнее, чем создавать для них отдельную таблицу
3. @user81993 . . . Вам нужна
ObjectData
таблица с одной строкой на объект и одной строкой на данные. Вы не должны помещать данные в одно объединенное поле. Это просто неправильный подход.