Предотвращение интернет-магазина без продуктов при импорте данных - PullRequest
1 голос
/ 30 июля 2011

На моем сайте несколько поставщиков могут импортировать свои статьи.

Я хочу дать им возможность убирать их статьи (например, удалять статьи, отсутствующие в файле импорта).

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

Поэтому, подумав, я нашел два других решения:

  1. импортируйте товары и запомните, какие товары были импортированы / обновлены (если они уже существовали), и удалите товары поставщика, которых впоследствии не было в импорте
  2. импортировать продукты в другую временную таблицу, удалить текущие продукты поставщика и затем скопировать продукты из временной таблицы в «настоящую» таблицу.

Однако могут быть некоторые проблемы с обоими вариантами.

  1. Допустим, помнить все импортированные / обновленные продукты - действительно хорошая идея, поскольку иногда это может быть> 1 млн. Продуктов?
  2. Удастся ли удалить текущие продукты и скопировать продукты из временной таблицы в реальную таблицу так быстро, что существует лишь малая вероятность того, что посетитель не увидит никаких продуктов?

Возможно, есть еще проблемы с опциями, которые я выяснил.

Или, возможно, есть другие варианты сделать это?

PS

«Блокировка» сайта / блокировка клиентов при импорте невозможна.

Ответы [ 3 ]

2 голосов
/ 30 июля 2011

Когда я читал ваши вопросы, мне приходили в голову два решения:

  1. Запускайте "режим обслуживания" при импорте, но это, вероятно, не то, что вы хотите. Извинитене прочитал ваше последнее утверждение.
  2. Импортируйте (или удалите) элементы один за другим, потому что таким образом пользователь будет пропускать не более одного продукта в любой момент времени.Здесь следует учесть несколько предостережений:
    • Что произойдет, если товар будет удален, пока он находится в корзине покупок пользователя?
    • Ссылки в уже совершенных покупках должны оставаться неизменными, чтобы иметь возможность восстановить счет после того, как купленный продукт был удален.

Кроме того, вы можете переименовать таблицу в PostreSQL следующим образом:

ALTER TABLE TableB RENAME TO TableC;

На тот случай, если вы захотите использовать решение «временной таблицы», которое я тоже использовал, хотя, по общему признанию, в гораздо менее критических обстоятельствах.Но обратите внимание, что, по крайней мере в MySQL InnoDB, вам нужно беспокоиться о внешних ключах, которые все равно будут указывать на старую таблицу при переименовании, например, если есть внешний ключ от TableA к TableB, и вы переименовываете TableB в TableB_old и TableB_new вTableB, чем внешний ключ будет указывать на TableB_old.Я не знаю, так ли это с PostgreSQL.

1 голос
/ 30 июля 2011

У меня есть вариант одного из предложенных вами методов:
Иметь таблицу с именем vendortables setup, в которой есть столбцы для vendorname или id и имя таблицы, в которой перечислены их продукты. Когда поставщик хочет импортировать, создайте новую таблицу для ввода (возможно, vendorname + время начала загрузки). Загрузите все данные в него. Как только это будет сделано, возьмите имя таблицы текущего поставщика (в vendortables) и обновите ее, чтобы имя новой таблицы было связано с загружающим поставщиком. Затем удалите старую таблицу (которую вы взяли до обновления).
Таким образом, никакие данные таблицы не копируются.

Пример:

SELECT * FROM vendortables
+--+-----+
|id|table|
+--+-----+
|01|test |
+--+-----+

SELECT * FROM test
+--+----+
|id|name|
+--+----+
|01|car |
+--+----+


//Import & upload new data
CREATE TABLE test1 USING('?', 'new car')

SELECT * FROM test1
+--+--------+
|id|name    |
+--+--------+
|01|new car |
+--+--------+

//Phase in new data 
UPDATE vendortables SET table='test1' WHERE id='1'

//Delete old table
DROP TABLE test

И просто попросите PHP vendortables указать имя таблицы, отвечающей за отображение продуктов поставщика.

Кроме того, поскольку вы упоминаете о высокой загруженности вашего сайта, вы полагали, что кэширование, вероятно, сделает запрос во время импорта очень маловероятным.

0 голосов
/ 12 августа 2011

сделать таблицу удаления

delete from del_vendor_article where vendorid='vendorid'

сделать это при обновлении статьи

insert into del_vendor_article SET vendorid='vendorid', article_id='articleid'

возможно показать им, что будет удалено.затем они могут удалить все, что захотят сохранить

SELECT item FROM articles WHERE NOT EXISTS (SELECT * FROM del_vendor_article WHERE articles.articles_id = del_vendor_article.articles_id);

удалить не импортированные элементы

delete from articles WHERE NOT EXISTS (SELECT * FROM del_vendor_article WHERE articles.articles_id = del_vendor_article.articles_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...