Ответы пользователя по тегу Базы данных
  • Как правильно построить архитектуру таблиц в моем случае? Как не плодить таблицы?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Группы храните в формате XML в отдельной таблице
    а в строку где необходимо указать некий набор (Группу) передавайте ID Группы
    Ответ написан
    Комментировать
  • Какие Вы знаете программы для переноса данных из одной бд в другую?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    1. ETL (Интегрейшен сервис) <-- выполняет все Ваши условия
    2. Запросы к прилинкованному серверу

    Еще варианты полного переноса данных на другой сервер:
    3. Репликации таблиц
    4. ОлвейсОн базы данных (MS SQL)
    5. Лог шипинг (MS SQL - повторение транзакций на другом сервере)
    Ответ написан
    Комментировать
  • Стоит ли разнести данные в БД: на пользователя своя схема?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    1. Тяжело ли работать с такой структурой БД?
    - Да это будет геморрой, особенно в части замусоривание базы разными таблицами
    но эксплуатировать легче (каждый пользователь видит только свои данные и с ними сам работает)

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

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

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

    Вообще то так майкрософтом и рекомендуется поступать
    Ответ написан
    Комментировать
  • Какие есть хранилища для логов и статистики?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    а у меня сейчас на работе такая же фигня ....
    давайте будем применять NO SQL .... и началось....

    Ну запишешь ты 10 миллионов строк в секунду
    как ты их потом обрабатывать будешь?
    Яровая стайл?

    выход простой - писать в маленькие секционированные таблицы в которых (маленькие по времени - например данные хранить в них не более 2 недель, есть варианты где и по суткам секционированно)
    потом переключать эти таблицы в хранилище - там хранить месяца 2-3 (примерно)
    когда уже обработка вся закончилась (данные стали редко востребованными) перекидывать в долгосрочное хранение при этом грохать все индексы, включать компрессию страниц и хранить уже полгода (желательно в другой БД)
    потом эту Архивную БД бэкапить и убирать с сервера

    И правильно сказали выше
    чем больше индексов тем больше тормозят операции вставки и апдейты

    так же встречал схему где такие базы логов хранятся исключительно на отдельном сервере - а в аналитические хранилища переходят логшипингом или олвейс Он или бэк аром раз в два дня

    Не переживайте - и Монго Вы тоже можете забить инсертами, а уж Апдейты там вообщето уязвимое место (данные копируются сразу в несколько таблиц - денормализация, и что бы апдейтануть одну запись она будет искаться везде где она есть .... надеюсь понятно объяснил. А искаться блин JSONом! ) :)
    Ответ написан
    1 комментарий
  • Нужен ли индекс или нет?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    2 вариант
    Ответ написан
    Комментировать
  • Как расположить в несколько столбцов данные из одной строки?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Комментировать
  • Как сделать выборку из всех таблиц одной базы данных в SQL Server?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    SELECT * FROM sys.tables t1
    JOIN sys.columns t2 ON t1.object_id=t2.object_id
    WHERE t2.column_name.xxx ='yyy'
    Ответ написан
    Комментировать
  • Как составить sql запрос для выборки статей и комментариев из связанных таблиц?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    ответ на 1 вопрос:
    По теории быстрее второй вариант (тот который у Вас помечен как - "Первый раз я написал так"
    потому что:
    - SELECT * FROM
    так писать не стоит - Звездочка всегда работает медленне чем перечисление колонок, не намного :) но все же
    - просто Left join будет работать быстрее, чем подзапрос - особенно если есть необходимые индексы

    ответ на 2 вопрос:
    "чтобы возвращалось:[данные первой статьи,[первый комментарий, второй, ...]]"(с)
    поддержка такого формата ---> "JSON" реализована в MS SQL 2016

    Ну смотри :)
    Сам напросился :)

    -- Делаем таблички
    CREATE TABLE story( id int ,[text] text,author_id int )
    CREATE TABLE story_comments( id int,s_id INT,[text] text)
    
    -- Заполнем данными
    
    TRUNCATE TABLE [story]
    TRUNCATE TABLE [story_comments]
    
    INSERT INTO [dbo].[story]([id],[text],[author_id])VALUES(1,'Статья 1',1)
    INSERT INTO [dbo].[story]([id],[text],[author_id])VALUES(2,'Статья 2',2)
    
    INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(1,1,'Первый комент Первой статьи')
    INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(2,1,'Второй комент Первой статьи')
    INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(3,1,'Третий комент Первой статьи')
    
    -- Сам запрос
    
    ;WITH cte 
    AS
    ( 
    SELECT [text2]=
    (
    SELECT 
    --s.id     AS 'Story_ID',
           s.[text]  AS 'Story_Text'
    	   ,
         (
    SELECT ISNULL(
    REPLACE( 
    REPLACE(
    REPLACE(
    (SELECT [text]=
    (SELECT sc.[text]AS 'comment_Text'
    FROM [story_comments] sc
    WHERE  s.id=sc.[s_id]
    FOR XML PATH (''))),'</comment_Text><comment_Text>',',')
    ,'<comment_Text>','['),'</comment_Text>',']')
    ,'[NULL]')
    )  
    FROM   [story] s
    FOR XML PATH('')
    ))
    
    SELECT '['+
    REPLACE(
    replace (
    REPLACE (text2,'<Story_Text>','[')
    ,'</Story_Text>[',',[')
    ,'][','],[')+']'
     FROM cte
    
     Ответ:
     [[Статья 1,[Первый комент Первой статьи,Второй комент Первой статьи,Третий комент Первой статьи],[Статья 2,[NULL]]
    Ответ написан
    Комментировать
  • Как правильно составить SQL запрос?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    -- Создали таблицы
    CREATE TABLE counts (count_id INT IDENTITY (1,1) , count_name nVARCHAR(20))
    CREATE TABLE operation  (operation_id INT IDENTITY (1,1) ,operation_count_id INT, balance MONEY,operation_date DATETIME ,operation_name NVARCHAR(50))
    
    go
    -- Очищаем таблицы
    TRUNCATE TABLE counts
    TRUNCATE TABLE operation
    
    -- Заполняем данным
    INSERT INTO [dbo].[counts] ([count_name]) VALUES ('Первый счет')
    INSERT INTO [dbo].[counts] ([count_name]) VALUES ('Второй счет')
    INSERT INTO [dbo].[counts] ([count_name]) VALUES ('Третий счет')
    
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(1,'10.3','01-01-2015','Первая операция по первому счету')
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(1,'25.5','02-02-2015','Вторая операция по первому счету')
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(1,'34.4','03-03-2015','Третья операция по первому счету')
    
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(2,'11.7','01-01-2015','Первая операция по Второму счету')
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(2,'22.2','04-04-2015','Вторая операция по Второму счету')
    
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(3,'33.1','01-01-2015','Первая операция по Тертья счету')
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(3,'33.7','02-02-2015','Вторая операция по Третья счету')
    
    
    -- Запрос возвращает баланс последней операции по каждому счету
    SELECT c.count_id,c.count_name
    ,o2.balance
    ,o2.operation_name
     FROM counts c
     JOIN (
    SELECT operation_count_id,
     MAX(operation_date)  AS 'Max Date'
    FROM dbo.operation 
    GROUP BY operation_count_id
    
    ) o ON o.operation_count_id=c.count_id
    JOIN dbo.operation o2 ON o2.operation_count_id=o.operation_count_id AND o2.operation_date=o.[Max Date]
    Ответ написан
    Комментировать