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

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

DELIMITER $$

DROP PROCEDURE IF EXISTS `insert_csv` $$
CREATE PROCEDURE `insert_csv`(_list MEDIUMTEXT)
BEGIN

DECLARE _next TEXT DEFAULT NULL;
DECLARE _nextlen INT DEFAULT NULL;
DECLARE _value TEXT DEFAULT NULL;

iterator:
LOOP
  -- exit the loop if the list seems empty or was null;
  -- this extra caution is necessary to avoid an endless loop in the proc.
  IF LENGTH(TRIM(_list)) = 0 OR _list IS NULL THEN
    LEAVE iterator;
  END IF;

  -- capture the next value from the list
  SET _next = SUBSTRING_INDEX(_list,',',1);

  -- save the length of the captured value; we will need to remove this
  -- many characters + 1 from the beginning of the string 
  -- before the next iteration
  SET _nextlen = LENGTH(_next);

  -- trim the value of leading and trailing spaces, in case of sloppy CSV strings
  SET _value = TRIM(_next);

  -- insert the extracted value into the target table
  INSERT INTO t1 (c1) VALUES (_next);

  -- rewrite the original string using the `INSERT()` string function,
  -- args are original string, start position, how many characters to remove, 
  -- and what to "insert" in their place (in this case, we "insert"
  -- an empty string, which removes _nextlen + 1 characters)
  SET _list = INSERT(_list,1,_nextlen + 1,'');
END LOOP;

END $$

DELIMITER ;

Далее, таблица для test:

CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Новая таблица пуста.

mysql> SELECT * FROM t1;
Empty set (0.00 sec)

Вызовите процедуру.

mysql> CALL insert_csv('foo,bar,buzz,fizz');
Query OK, 1 row affected (0.00 sec)

Обратите внимание, что «1 строка затронута» не означает, что вы ожидаете. Это относится к последней вставке, которую мы сделали. Поскольку мы вставляем по одной строке за раз, если процедура вставляет не менее в одну строку, вы всегда получите количество строк в 1; если процедура ничего не вставляет, вы получите 0 строк.

Это сработало?

mysql> SELECT * FROM t1;
+----+------+
| id | c1   |
+----+------+
|  1 | foo  |
|  2 | bar  |
|  3 | buzz |
|  4 | fizz |
+----+------+
4 rows in set (0.00 sec)

40
задан patmortech 20 September 2008 в 05:08
поделиться

8 ответов

Размер является Вашим врагом. Если Вы будете иметь дело с большим количеством данных и большими количествами строк, то наличие исторического, смешанного в с током, будет ковать Вас. У Вас также будут проблемы, если Вы присоединитесь к другим данным с проверкой, что у Вас есть правильные строки.

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

Если у Вас есть много типов данных, которые будут иметь этот механизм, но не должны вести хронологический учет, я предложил бы общую таблицу очереди для рассмотрения незаконченных объектов, сказал бы сохраненный как xml. Это позволило бы всего одной таблице быть считанной администраторами и позволит Вам добавить эту функциональность к любой таблице в Вас система довольно легко.

9
ответ дан 27 November 2019 в 01:53
поделиться

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

  1. Основная таблица A
  2. Другая Таблица B, которая хранит измененную запись (и так точно подобно первому), + 2 дополнительных столбца (FKey к C и коду для указания на вид изменения)
  3. Третья таблица C, которая хранит все такие записи то одобрение потребности
  4. Четвертая таблица D, которая хранит историю (Вам, вероятно, не нужно это).

Я рекомендую этот подход. Это обрабатывает все сценарии включая обновления и удаления очень корректно.

5
ответ дан 27 November 2019 в 01:53
поделиться

Определенно сохраните их в основной таблице со столбцом, чтобы указать, утверждены ли данные или нет.

Когда изменение утверждено, никакое копирование не требуется. Дополнительная работа для фильтрации неутвержденных данных является видом вещи, которую базы данных, как предполагается, делают, когда Вы думаете об этом. При индексации утвержденного столбца это не должно быть слишком обременительно, чтобы сделать правильную вещь.

20
ответ дан 27 November 2019 в 01:53
поделиться

Учитывая перемещение соответствия НОСКОВ, которое пихнули перед лицом наиболее публично проданных компаний, у меня было довольно мало опыта в этой области. Обычно я использовал отдельную таблицу со временем, штампованным, ожидая изменения со своего рода столбцом флага. Ответственное лицо администрирования этих данных получает список незаконченных изменений и может принять решение принять или не принять. Когда часть данных принята, я использую триггеры для интеграции новых данных в таблицу. Хотя некоторые люди не любят триггерный метод и кодировали бы это в сохраненный procs. Это работало хорошо на меня, даже в довольно больших базах данных. Сложность может стать немного трудной иметь дело с, особенно имея дело с ситуацией, где одно изменение непосредственно конфликтует с другим изменением и что порядок обработать эти изменения в. Таблица, содержащая данные запроса, никогда не может мочь быть удаленной, так как это содержит "панировочные сухари" так сказать, которые требуются в случае, если существует потребность проследить то, что произошло в конкретной ситуации. Но в любом подходе, риски должны быть оценены, такой как, что я упомянул с противоречивыми данными, и слой бизнес-логики должен существовать для определения процесса в этих ситуациях.

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

4
ответ дан 27 November 2019 в 01:53
поделиться

Еще одна идея состояла бы в том, чтобы иметь три таблицы.

  • Можно было бы быть основной таблицей для содержания исходных данных.
  • Второе содержало бы предложенные данные.
  • Третье содержало бы исторические данные.

Этот подход дает Вам способность к быстро, и легко откатывайте, и также дает Вам журнал аудита, если Вам нужен он.

2
ответ дан 27 November 2019 в 01:53
поделиться

Поскольку это - веб-приложение, я собираюсь предположить, что существует больше чтений, чем записи, и Вы хотите что-то довольно быстро и Ваше разрешение конфликтов (т.е. неисправные одобрения) результаты в том же поведении - последнее обновление является тем, которое используется.

Обе из стратегий, которые Вы предлагаете, подобны в, они оба содержат одну строку на массив изменений, должны иметь дело с конфликтами и т.д., при этом единственная разница - хранить ли данные в одной таблице или два. Учитывая сценарий, две таблицы кажутся лучшим решением по причинам производительности. Вы могли также решить это с одной таблицей и представлением новых утвержденных изменений если Ваша поддержка БД это.

1
ответ дан 27 November 2019 в 01:53
поделиться

Я составил бы таблицу с флагом и создал бы представление как

 CREATE OR REPLACE VIEW AS 

  SELECT * FROM my_table where approved = 1

Это может помочь разделить зависимости между доказательством вины и запросами. Но может быть, не лучшая идея если потребность сделать обновления представления.

Перемещение записей могло бы иметь некоторые соображения производительности. Но Разделенные таблицы могли сделать что-то весьма схожее.

2
ответ дан 27 November 2019 в 01:53
поделиться

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

0
ответ дан 27 November 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: