Возможно ли частично получить / изменить поле?

#php #mysql

#php #mysql

Вопрос:

Я настраиваюсь на сбор статистики за долгое время. Это будет записано небольшими блоками, которые я планирую поместить все в одно текстовое поле, последние первыми .. вроде этого

 [date:03.01.2016,data][date:02.01.2016,data][date:01.01.2016,data]...
  

это будет происходить чаще (просто образец), но должно оставаться достаточно маленьким, чтобы вести запись десятилетиями, и в то же время достаточно большим, чтобы я захотел его оптимизировать.

Я ищу 2 вещи

  1. Можете ли вы добавить перед полем в mysql?
  2. Можете ли вы частично прочитать поле, например, только первые 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 таблица с одной строкой на объект и одной строкой на данные. Вы не должны помещать данные в одно объединенное поле. Это просто неправильный подход.