Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Roman_rc
26 / 26 / 12
Регистрация: 04.02.2013
Сообщений: 250
MS SQL

Стоит ли делать отдельную базу для комментариев?

26.03.2016, 22:02. Показов 991. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, чисто вопрос о "лучших практиках". Разрабатываю интернет-магазин и нужно добавить "продвинутые" комментарии под каждый товар, планируется много комментариев т.е. предполагается, что пользователи будут довольно активно обсуждать уникальную единицу товара. Подумал может быть есть смысл сделать отдельную базу под комментарии? Ваше мнение?

База пока MS SQL 2014 Exrpess.

Возможно ошибаюсь, но как мне кажется получу следующие плюсы:
1. База будет расти отдельно от основной.
2. Т.к. база будет из нескольких таблиц, то поддержка проще.
3. Возможно будут работать отдельные приложения, отдельно, только с этой базой.
4. Ваше мнение если что-то еще...

Минусы такого подхода, видимо, следующие:
1. Отсутствие связей между таблицами.
2. Запросы усложнятся.
3. Усложненные транзакции.
4. Что-то еще, Ваше мнение и опыт...


Просьба помочь, чтобы принять верное решение.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.03.2016, 22:02
Ответы с готовыми решениями:

Нужно ли делать отдельную таблицу для цен
Ситуация следующая... Имеется бд для магазина одежды. В магазин может поступать один и тот же товар по разным ценам. Предположим есть...

На чем стоит делать сайт для заказчика?
Если делать с нуля, то как заказчик будет вносить изменения в сайт?(Он еще похуже меня скорее всего в этой теме будет), у CMS функционал...

Стоит ли создавать отдельную ветку
Если есть проект только с одним разработчиком, то стоит ли этому разработчику создавать отдельную ветку "developer" и потом ее...

9
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
27.03.2016, 07:36
Roman_rc, я бы скорее склонился к единой базе.

Цитата Сообщение от Roman_rc Посмотреть сообщение
1. База будет расти отдельно от основной.
Если это важно, то можно создать отдельную filegroup для таблиц с комментариями.

Цитата Сообщение от Roman_rc Посмотреть сообщение
2. Т.к. база будет из нескольких таблиц, то поддержка проще.
Не факт. Например, нам придется иметь дело с двумя резервными копиями вместо одной.

Цитата Сообщение от Roman_rc Посмотреть сообщение
3. Возможно будут работать отдельные приложения, отдельно, только с этой базой.
Это можно решить и в рамках одной базы путем правильной выдачи прав.
1
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
27.03.2016, 19:09
Roman_rc, я бы тоже не делал 2 базы:
Цитата Сообщение от Roman_rc Посмотреть сообщение
База будет расти отдельно от основной.
да, но по сути админить и обслуживать придется уже 2 базы.
Цитата Сообщение от Roman_rc Посмотреть сообщение
Возможно будут работать отдельные приложения, отдельно, только с этой базой.
возможно а возможно и нет. Во всяком случае вам придется писать сложные запросы смотрящие в обе базы, что мягко скажем так сыграет на производительности. Далее вам как то надо будет настроить связи между 2мя этими базами, причем путем каких нибудь сложных транзакций в обе базы.
Собственно что вы выиграете от этого я не знаю. Ну упростите в чем то работу с комментариями, но усложните себе работу в целом при добавлении\редактировании\выборке\удален ии записей + обслуживании. 2 базы + 2 копии.

Добавлено через 33 минуты
и еще добавлю, возможно я ошибаюсь, но по моему транзакция инициализируется в пределах одного коннекта к базе. 2 базы - 2 коннекта. А если не вставлять записи через транзакции в 2 базы то при мелкой сбое чревато тем что во 2й будут "мертвые" комментарии (без Id-шников). Хотя где то читал что firebird может делать 1 транзакцию в 2 базы, а вот на счет остальных я не уверен.
Из определения транзакций:
Транзакция представляет собой последовательность операторов языка SQL, которая рассматривается как некоторое неделимое действие над базой данных, осмысленное с точки зрения пользователя. Транзакция - это логическая единица работы, выполняемая базой данных.
как я понимаю в пределах одной БД.
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.03.2016, 19:18
Цитата Сообщение от wm_leviathan Посмотреть сообщение
если не вставлять записи через транзакции в 2 базы то при мелкой сбое чревато тем что во 2й будут "мертвые" комментарии (без Id-шников).
wm_leviathan, это не так критично, ведь создать транзакцию (хоть к десятку БД) мы можем и в коде. Естественно, на каждый коннект будет своя транзакция, но через try{ } catch{ } они либо все выполнятся, либо все не выполнятся.
1
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
27.03.2016, 19:27
insite2012,
Цитата Сообщение от insite2012 Посмотреть сообщение
но через try{ } catch{ }
а разве даже при сбое 1 из нескольких try не пропустит их все ? там же при сбое в commit уйдет но запрос то в целом выполнится нормально. По моему на catch никогда не уйдет. Посути запрос выполнится без ошибок просто сам сервер откатит изминения
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.03.2016, 19:29
Цитата Сообщение от wm_leviathan Посмотреть сообщение
разве даже при сбое 1 из нескольких try не пропустит их все ?
Естественно пропустит. В том и смысл, берем несколько объектов транзакций к разным БД и объединяем их в одну крупную. Сбой любой из них приведет к откату всех. Если все прошли успешно-все отправляются на закрепление.
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
27.03.2016, 19:35
Цитата Сообщение от insite2012 Посмотреть сообщение
объединяем их в одну крупную
а коннект у этой крупной куда будет смотреть в какую базу ?
0
 Аватар для Roman_rc
26 / 26 / 12
Регистрация: 04.02.2013
Сообщений: 250
27.03.2016, 19:46  [ТС]
Может быть действительно не стоит разделять. Ведь по сути это одна предметная область - объявление и комментарии к ним. А так я их силой разделю, соответственно нет связи на уровне базы либо сложны.

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

через try{ } catch{ } они либо все выполнятся, либо все не выполнятся
Так что работать с несколькими транзакциями на чтение не приносит проблем даже с двумя базами, они появляются когда идет чтение и обновление двумя приложениями.


В коде это выглядит примерно так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using (var tran1 = ctx.Database.BeginTransaction(IsolationLevel.Serializable))
            {
                try
                {
                   //...
                    using (tran2 = ctx2.Database.BeginTransaction(IsolationLevel.Serializable))
                    {
                        //...
                        if (false) tran2.Rollback();
                    }
                }
                catch (Exception)
                {
                    tran1.Rollback();
                    throw;
                }
            }
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
27.03.2016, 19:58
перерыл весь msdn но вроде нашел инфу о том что можно использовать 1 транзакцию в нескольких серверах. делается муторно и через распределенную транзакцию BEGIN DISTRIBUTED TRANSACTION. Признаю был не прав на счет транзакций. вот ссылка на msdn https://msdn.microsoft.com/ru-... 20%29.aspx

Добавлено через 11 минут
insite2012, Roman_rc, Спасибо не знал что средствами шарпа можно замутить такое через try\catch буду знать
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.03.2016, 20:02
Цитата Сообщение от wm_leviathan Посмотреть сообщение
не знал что средствами шарпа можно замутить такое через try\catch
wm_leviathan, примерно такая конструкция. Все отлично отрабатывает, можете проверить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SQLite;
 
namespace TxDemo {
    public class TxOperator {
        string CONNECT_STR1 = "Data Source=base1.db";
        string CONNECT_STR2 = "Data Source=base2.db";
 
        public void ProcessTransaction(bool throwError, int id, string name) {
            string insertCmd = string.Format("INSERT INTO Test VALUES('{0}','{1}')", id, name);
 
            SQLiteConnection cnn1 = new SQLiteConnection(CONNECT_STR1);
            SQLiteConnection cnn2 = new SQLiteConnection(CONNECT_STR2);
 
            cnn1.Open();
            cnn2.Open();
 
            SQLiteTransaction tx1 = cnn1.BeginTransaction();
            SQLiteTransaction tx2 = cnn2.BeginTransaction();
            try {                
                SQLiteCommand cmd1 = new SQLiteCommand(insertCmd, cnn1);
                SQLiteCommand cmd2 = new SQLiteCommand(insertCmd, cnn2);
               
                cmd1.Transaction = tx1;                
                cmd2.Transaction = tx2;
 
                cmd1.ExecuteNonQuery();
                cmd2.ExecuteNonQuery();
 
                if (throwError) {
                    throw new Exception("Transactions failed!");
                }
                tx1.Commit();
                tx2.Commit();
            }
            catch (Exception ex) {
                tx1.Rollback();
                tx2.Rollback();
 
                throw ex;
            }
            finally {
                cnn1.Close();
                cnn2.Close();
            }
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace TxDemo {
    class Program {
        static void Main(string[] args) {
            TxOperator txOperator = new TxOperator();
            try {
                txOperator.ProcessTransaction(false, 0, "Me");
                Console.WriteLine("Transaction completed!");
            }
            catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }           
            Console.ReadLine();
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2016, 20:02
Помогаю со студенческими работами здесь

[Github] Почему мне следует комитить файл лицензии в отдельную ветку и делать pull request?
https://help.github.com/articles/adding-a-license-to-a-repository/ В 8 пункте сказано, что если у меня текущая ветвь master, то мне...

Дескрипторы XML-комментариев: стоит ли описывать весь код именно по каждой директиве
Кто-нибудь лично ими пользуется и встречал ли на практике? Стоит ли описывать весь код именно по каждой директиве? Я пользуюсь...

Стоит ли делать редирект
Сайт был без админки и полностью на html. Такой вопрос - старые страницы, которых уже не существует, до сих пор есть в поиске но позиции у...

Стоит ли делать апгрейд ПК?
есть бюджетный i5 - 2310 s1155 на GA-h67m-d2-b3 GF 550 Ti ssd OCZ Vector 4 128 GB hdd 1 Tb Seagate монитор разрешение 1920...

Стоит ли делать дальше?
Здравствуйте уважаемые посетители этого топа! Сегодня вопрос будет такой: я сделал несколько обучающих уроков по PHP и хотел бы узнать ваше...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru