Эффективные вставки один-ко-многим в C # и MsSql - PullRequest
0 голосов
/ 09 апреля 2009

У меня есть две таблицы, которые выглядят так:

News: (ID, Title, TagID)
Tags: (ID, Tag)

Каждая новость может иметь только один тег. Каков наиболее эффективный способ обработки вставок в таблице новостей? Таблица тегов содержит около 50 000 строк.

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

Если тега нет в таблице тегов, мне нужно вставить его и установить TagID для вновь вставленного идентификатора.

Надеюсь, вы поймете идею!

Ответы [ 2 ]

1 голос
/ 09 апреля 2009

Какую версию SQL Server вы используете в фоновом режиме?

Если вы используете SQL Server 2008, я бы порекомендовал массово загружать теги и новости для каждого дня во временную рабочую таблицу, а затем использовать инструкцию MERGE для обновления фактической таблицы тегов и новостей из этих рабочих таблиц. Для этого я бы использовал класс C # "SqlBulkCopy".

MERGE позволяет легко вставлять только те элементы, которые были изменены, и, возможно, обновлять уже существующие, в одном удобном SQL-выражении.

Если вы работаете на SQL Server 2005 или ниже, вы можете сделать то же самое, но вам придется написать некоторый код (C # или T-SQL), чтобы вручную проверить, что нужно вставить из ваших временных таблиц массовой загрузки. и то, что уже присутствует.

Марк

0 голосов
/ 09 апреля 2009

Я предполагаю, что с каждой новостью вы получите список строк, которые являются предполагаемыми «тегами». Из структуры, которую вы дали, вы можете иметь только один тег на каждую новость? Это кажется необычным, но ниже все равно применимо.

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

Делайте выбор из тегов, где Tag = что угодно1 (делайте это для каждого тега), каждый раз, если строки не возвращаются, вставьте его, в противном случае используйте найденный вами идентификатор для этого. Запустите процесс для каждой вставки.

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