Как назначить вращающуюся категорию для записей базы данных в порядке поступления записей? - PullRequest
0 голосов
/ 06 мая 2010

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

По этой причине я не могу сделать что-то простое, например, для сопоставления первой категории 5 с идентификаторами 1, 6, 11, 16.

Я рассмотрел чтение списка текущих возможных категорий, проверку значения последней вставленной и затем присвоение новой записи следующей категории, но я представляю, если два запроса приходят одновременно, я потенциально может назначить им одну и ту же категорию, а не по порядку.

Итак, мой нынешний раунд мышления следующий:

  • блокировка таблиц (категорий и записей)
  • вставить новейшую строку в записи
  • получить идентификатор новейшей строки
  • выбрать строку, предшествующую вставке (используя order by auto_inc_name desc 0, 1)
  • взять категорию предыдущей строки и взять следующую из списка кошек
  • обновить новую вставленную строку
  • разблокировать стол

Я не уверен на 100%, что это будет работать правильно, и, возможно, есть гораздо более простой способ сделать это, поэтому я спрашиваю:

A. Будет ли это работать, как я описал в оригинальной задаче? B. Есть ли у вас лучший / более простой способ сделать это?

Спасибо ~

Ответы [ 3 ]

1 голос
/ 06 мая 2010

Я бы сделал это намного проще ... просто создайте таблицу с одной записью "last_category" (без знака tinyint not_null). Каждый раз, когда вы делаете вставку, просто увеличивайте это значение и сбрасывайте при необходимости.

0 голосов
/ 04 июня 2010

Если вам нужно 100% правильное поведение, звучит так, как будто вам нужно что-то заблокировать, чтобы все ваши вставки выстроились правильно Возможно, вам удастся избежать блокировки таблицы категорий, если вы используете один оператор SQL для вставки ваших данных. Я не уверен, чем отличается MySQL, но в Oracle я могу сделать это:

insert into my_table (id, col1, col2, category_id)
select :1, :2, :3, :4, c.id -- :1, :2, etc are bind variables. :1 corresponds to the ID.
from 
  (select 
      id, -- category id
      count(*) over (partition by 1) cnt, -- count of how many categories there are
      row_number() over (partition by 1 order by category.id) rn -- row number for current row in result set
   from category) c
where c.rn = mod(:1, cnt)

Таким образом, в одном утверждении я вставляю следующую запись, основываясь на категориях, которые существовали в тот момент. Вставка автоматически блокирует таблицу my_table до фиксации. Он захватывает категорию на основе модуля идентификатора. Эта ссылка показывает, как сделать номер строки в mysql. Я не уверен, если count(*) требует group by в mysql; в oracle это происходит, поэтому я использовал раздел вместо того, чтобы считать весь набор результатов.

0 голосов
/ 07 мая 2010

Я не уверен, что понимаю вашу проблему, но, насколько я понимаю, вы хотели бы иметь что-то вроде

category | data
-----------------
0        | lorem
1        | ipsum
....     | ...
4        | dolor
0        | sit
...      | ...

Как насчет наличия уникального столбца auto_increment, и пусть category будет MOD 5 этого столбца?

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