2009-05-30 2 views
0

Что происходит, когда я загружаю медиа на свой сайт; каждый получит уведомление. Каждый человек может щелкнуть поле, которое нужно удалить, и оно исчезнет с их очереди сообщений навсегда.Лучший способ сделать 10 000 вставок в SQL db?

Если у меня было 10 000 человек на моем сайте, как я могу добавить его в очередь для каждого человека? Я могу себе представить, что это занимает много времени, поэтому я бы выбрал что-то вроде журнала файловой системы? отметьте, что мне нужно уведомить людей, данные - это моя текущая позиция. Затем обновите мою позицию каждые 100 вставок или около того? Мне нужен ПК в списке наблюдателей, поэтому, если кто-нибудь зарегистрируется в середине этого, мой заказ не будет нарушен, так как я буду сортировать через ПК?

Это лучшее решение для системы массового оповещения?

-edit-

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

+0

Какое программное обеспечение для баз данных вы используете? Он работает на одном сервере или в настройке ведущего/ведомого или в качестве кластера или ...?Пожалуйста, предоставьте более подробную информацию. –

+0

Wim: На самом деле у меня нет никаких подробностей. В настоящее время у меня есть прототип с использованием C# и sqlite в качестве базы данных. – 2009-05-30 00:40:39

ответ

3

Если 10000 вставок в узкую много-много таблиц, связывающих получателей с сообщениями (recipientid, messageid, status) медленно, я ожидаю, что у вас возникнут проблемы с дизайном.

Это вид операции я бы не обычно даже беспокоиться о дозировании или людях, подписавшихся в середине операции поста - в основном:

Предполагая, что @publisherid известно, @msg известного по SQL Server:

BEGIN TRANSACTION 

INSERT INTO msgs (publisherid, msg) 
VALUES(@publisherid, @msg) 
SET @messageid = SCOPE_IDENTITY() 

INSERT INTO msqqueue (recipientid, messageid, status) 
SELECT subscriberid, @messageid, 0 -- unread 
FROM subscribers 
WHERE subscribers.publisherid = @publisherid 

COMMIT TRANSACTION 
1

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

(Peformance оптимизация намек мой DBA в моей старой работе: «бизнес-процессы являются легкие вещи, чтобы изменить, посмотреть на них первый»)

+0

Это звучит как что-то, что я сделал бы, чтобы скопировать структуру (на изменение, а не сразу). Но в этом случае это не было бы хуже? 10 000 будет * непрерывно * опросить меня, чтобы узнать, обновлен ли я? – 2009-05-30 00:49:39

+0

Я не вижу, что это хуже ... как вы собираетесь уведомлять пользователей, даже если вы вставляли в таблицу уведомлений при создании сообщения - вы должны были опросить это? Да, каждый пользователь будет делать что-то вроде «select ... from message where message.created>: horizon и не существует (выберите 1 из message_read, где message_read.user =: user и message_read.message_id = message.message_id)" , Индексы сообщения (созданные) и message_read (user_id, message_id) должны сделать простой запрос. – araqnid

+0

Я бы выбрал очередь пользователей msg и ничего больше. Я думаю, что мой пост плох, я не единственный, кто может загружать медиа. Его сайт контента пользователя, как youtube. Будет несколько администраторов, которые могут размещать глобальные медиа и глобальные сообщения вместе с популярными людьми, которые могли бы привлечь десятки подписчиков. Это несколько мест для опроса вместо вашего центра сообщений. Я планировал делать вставки, когда автор запускает его (загрузка отправляет сообщение msg/media). – 2009-05-30 01:11:33

0

ИМХО вставляя записи не может быть наиболее эффективным решением этой проблемы. Можете ли вы использовать файл cookie на стороне клиента, чтобы сохранить, удалило ли пользователь уведомление или вам нужно отслеживать это, даже если они очищают файлы cookie? Если вы загружаете новое видео, приложение может просто сравнить файл cookie с новым идентификатором видеозаписи и принять решение отображать или скрывать уведомление, основанное на том, что хранится в файле cookie. Это избавит вас от тонны вложений в базу данных и сохранит большую нагрузку на клиента.

+0

Мне нужно было бы отслеживать это на сервере, но разве это не просто перемещение вставки для выбора, так как теперь 10000 нужно опросить меня вместо этого? – 2009-05-30 00:51:41

+0

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

0

Если вы используете Postgres, вы можете использовать команду COPY, которая является самым быстрым способом их всех:

COPY tablename (col1, col2, col3) FROM '/path/to/tabfile'; 

где tabfile является TAB разделенных файлов с большим количеством записей. Однако это приведет к сбою, если есть некоторые ограничения UNIQUE, и в файле есть дубликаты.

1

Я бы сказал, просто позвольте базе данных заботиться о вещах, которые он хорошо способен и предназначен для этого. Вставка и управление данными. Не пытайтесь делать это в коде, просто напишите SQL, чтобы вставить данные за один раз. 10000 строк - это леденец для всех реальных баз данных.

Смежные вопросы