SlideShare ist ein Scribd-Unternehmen logo
1 von 22
Реверс-инжиниринг. Восстанавливаем структуру данных
Николай Соколовский, Станислав Рождественский
Dev1: …у нас есть исходный код, посмотрим там
Dev2: [мрачно] в коде лес чудес
Когда чаще всего надо реверсить структуру
данных?
1. Миграции данных
A. Из старой версии в новую
B. Из одного продукта в другой (замена
продукта)
2. Интеграции с другими приложениями
3. Поддержка приложения
4. Обновление приложения (новые фичи)
5. Переделка приложения (например смена
технологии)
Общие принципы
1. Все лгут (даже код, даже база).
2. Результат (форма, объем, детальность)
должен отвечать цели
3. Все пишется AsIs
4. Документирование – это процесс
Что можно использовать как источники
информации?
Технические:
1. База данных + приложение
2. Документация по проекту (в первую очередь системная)
3. Исходный код (code first)
4. Интервью с техническими stakeholders
Бизнес:
1. Нормативная документация
2. Интервью с бизнес Stakeholders
Здравый смысл
Как это сделать?
1. В базе все очень хорошо и есть доки
A. При необходимости дополняем/проверяем
документацию скриптами
B. генерация схемы (например Diagram MSSQL
Managment Studio)
C. пачка встреч для верификации, что вы
правы
2. В базе все плохо, источников почти что нет
A. исследование процессов
B. screen mapping + профайлер
C. исследование баз
D. ручное восстановление структуры
E. ручная схема и описание
Как найти скрытую логику?
1. Для целых значений:
A. Есть ли негативные, нули, положительные
B. Диапазон чисел
C. не нарушают ли они «смысл»
2. Для дробных значений:
A. Действительно ли там дроби?
B. Сколько знаков после запятой значимо?
C. В какие моменты происходит округление?
3. Даты и время. Какой формат хранения?
4. Для всех связанных таблиц. Есть ли «висячие» строки
5. Действительно ли эта таблица/поле/значение
используется сейчас?
Хранение наследования
Как выглядит нормализованное хранение
1. Для каждого уровня наследования своя
таблица
2. Наследники не хранят атрибуты родителя, но
хранят его Id
3. Записей в родительских таблицах столько же
сколько по сумме во всех отнаследованых от
него на всю глубину
Как выглядит не нормализованное хранение
1. Одна таблица с 100+ колонок
2. Колонки родителя всегда заполнены,
колонки наследника null все, если наследник
не задан
Как узнать требования к производительности,
консистентности, доступности?
1. Есть ли сочетания разных типов БД (RDB, NoSQL etc)
2. Есть ли распределенные базы
3. Есть ли зеркала данных
4. Как организовано бэкапирование и логирование
Как выявить риски интеграции данных?
1. Кто еще пишет в нашу базу и куда?
2. Все ли поля он передает, есть ли «закостыленные»
значения?
3. Куда мы отдаем данные?
4. Использует ли продовская БД или зеркала/поднятые
бэкапы. Каковые лаги по времени?
Так исторически сложилось….
Не нормализованные таблицы
Как выглядят
1. В столбцах дублируются атрибуты (reviewer1, reviewer2)
2. После Distinct + order by в строках есть такие же, или почти
такие же значения (СПб, СПБ, Питер, Питер. , Санкт-Петербург)
3. Много полей, которые пусты для бОльшей части записей
Что можно сделать
1. Если надо – запланировать рефакторинг
2. Нормализовать на уровне логической модели (с указанием
маппинга на реальные таблицы)
Божественный классификатор
Как это выглядит
1. В базе нет справочников
2. Есть странная таблица(ы) с именем вида List, Reference,
Dictionary.
3. Данные в этих таблицах не однородны и не содержат
признака типа записи.
Что можно сделать:
1. Для маппинга составлять справочники выполняя group by в
ссылающейся таблице + join на справочник
2. В конце - проверка скриптом не распределенных значений
Id Value
1 Палата 101
… …
154 F20.0
Шизофрения
… ….
1140 Выписан
… …
2240 Стол №3
… …
Некорректное удаление данных
Как выглядят
1. Одна таблица имеет статус/флаг
deleted/Archived другая нет. При этом мы
имеем дело с композицией сущностей
2. Left join к ссылающейся с отбором всех
удаленных вернет таблицу вида
Что можно сделать:
1. Обязательно выяснить причину
2. Учесть при использовании данных
MainTable->Id ReferencedTable-Id
Null 1
Null 2
Мертвые справочники и позиции в них
Как это выглядит
Join от справочника на все использующие таблицы
возвращает null
Что можно сделать:
1. Выяснить историю справочника (есть ли исторические
данные, используется ли в других системах)
2. Проверить что действительно не используется в
существующем коде (у разработчиков)
3. Проверить что не используется более в домене
(спросить у бизнеса)
Магические числа
Как выглядят
1. В поле, которое по сути является справочником,
лежат числа.
2. Самого справочника нет как отдельной таблицы
Что можно сделать:
1. Восстанавливать значения через код
2. Либо через скриншоты / тестовые прогоны, следя за
тем как меняются значения
3. Если надо – запланировать рефакторинг
Странные имена
Как выглядят
1. Транскрибированные (oborudovanije)
2. Без семантики (Field1)
3. Обманывающие (user = patient)
4. В базе 4 приложения, и нет схем
Что можно сделать:
1. Перепроверить семантику и ведение (разработчики +
бизнес)
2. Если надо – запланировать рефакторинг
Нет ключей (в т.ч. первичных)
Как это выглядит
Список keys пуст
Что можно сделать:
1. Синтаксический анализ (id, FieldId, имя поля
совпадает с именем имеющейся таблицы) + опрос
разработчиков
2. Анализ view, stored procedure
3. Профайлер
Мусорные данные
Как выглядит
Select field_name, count(field_name) from…. group by field_name
Возвращает что-то не укладывающиеся в семантику хранимых данных. Например:
1. Много пустых строк для текстовых полей
2. Не существующий Id в FK: -1, 0
3. Много несуразных дат (01/01/1900)
4. Все забито одними и тем же данными.
Например, время всегда – полночь
Что можно сделать:
1. Подтвердить расхождения с семантикой
2. Выяснить почему система пишет такие данные
Когда часы врут
1. Не верный часовой пояс сервера + хранение информации без указания часового пояса
2. Не используется при реальной необходимости
3. Ложное время
Как выглядит
1. Вам об этом сказали
2. Повторяющиеся значения
Что можно сделать:
1. Зависит от цели, в целом ничего
Суммы не бьются
1. Производные статусы
2. Итоговые суммы
Как выглядит
1. Обычное поле
2. Явные указания в логике / коде
3. Однотипные поля в основной и дочерних сущностях
Что можно сделать:
1. Перепроверить что вычисления проводились верно на всем
наборе данных
Спасибо за внимание
Соколовский Николай
Email:
sokolovskynik@gmail.com
Facebook:
https://www.facebook.com/sokolovskynik
Станислав Рождественский
Email:
Stanislav.Rozhdestvenskiy@dataart.com
LinkedIn:
https://www.linkedin.com/in/sirojdestvensky

Weitere ähnliche Inhalte

Andere mochten auch

Soft Skills: "Мягкие навыки" твердого характера
Soft Skills: "Мягкие навыки" твердого характераSoft Skills: "Мягкие навыки" твердого характера
Soft Skills: "Мягкие навыки" твердого характераSQALab
 
Дорогие ошибки. Продолжение
Дорогие ошибки. ПродолжениеДорогие ошибки. Продолжение
Дорогие ошибки. ПродолжениеSQALab
 
Прикладная аналитика ERP системы для малого предприятия
Прикладная аналитика ERP системы для малого предприятияПрикладная аналитика ERP системы для малого предприятия
Прикладная аналитика ERP системы для малого предприятияSQALab
 
Конверсия в Ecommerce
Конверсия в EcommerceКонверсия в Ecommerce
Конверсия в EcommerceSQALab
 
Иди и рисуй! Моделирование в работе аналитика
Иди и рисуй! Моделирование в работе аналитикаИди и рисуй! Моделирование в работе аналитика
Иди и рисуй! Моделирование в работе аналитикаSQALab
 
Как выбирать задачи, полезные для продукта
Как выбирать задачи, полезные для продуктаКак выбирать задачи, полезные для продукта
Как выбирать задачи, полезные для продуктаSQALab
 
Анализ атрибутов качества
Анализ атрибутов качестваАнализ атрибутов качества
Анализ атрибутов качестваSQALab
 
Modern BA - way to delivering value
Modern BA - way to delivering valueModern BA - way to delivering value
Modern BA - way to delivering valueSQALab
 
Business Analysts are on the GO: Design with users, not for them!
Business Analysts are on the GO: Design with users, not for them!Business Analysts are on the GO: Design with users, not for them!
Business Analysts are on the GO: Design with users, not for them!SQALab
 
BA as Digital Systems Analyst
BA as Digital Systems AnalystBA as Digital Systems Analyst
BA as Digital Systems AnalystSQALab
 

Andere mochten auch (10)

Soft Skills: "Мягкие навыки" твердого характера
Soft Skills: "Мягкие навыки" твердого характераSoft Skills: "Мягкие навыки" твердого характера
Soft Skills: "Мягкие навыки" твердого характера
 
Дорогие ошибки. Продолжение
Дорогие ошибки. ПродолжениеДорогие ошибки. Продолжение
Дорогие ошибки. Продолжение
 
Прикладная аналитика ERP системы для малого предприятия
Прикладная аналитика ERP системы для малого предприятияПрикладная аналитика ERP системы для малого предприятия
Прикладная аналитика ERP системы для малого предприятия
 
Конверсия в Ecommerce
Конверсия в EcommerceКонверсия в Ecommerce
Конверсия в Ecommerce
 
Иди и рисуй! Моделирование в работе аналитика
Иди и рисуй! Моделирование в работе аналитикаИди и рисуй! Моделирование в работе аналитика
Иди и рисуй! Моделирование в работе аналитика
 
Как выбирать задачи, полезные для продукта
Как выбирать задачи, полезные для продуктаКак выбирать задачи, полезные для продукта
Как выбирать задачи, полезные для продукта
 
Анализ атрибутов качества
Анализ атрибутов качестваАнализ атрибутов качества
Анализ атрибутов качества
 
Modern BA - way to delivering value
Modern BA - way to delivering valueModern BA - way to delivering value
Modern BA - way to delivering value
 
Business Analysts are on the GO: Design with users, not for them!
Business Analysts are on the GO: Design with users, not for them!Business Analysts are on the GO: Design with users, not for them!
Business Analysts are on the GO: Design with users, not for them!
 
BA as Digital Systems Analyst
BA as Digital Systems AnalystBA as Digital Systems Analyst
BA as Digital Systems Analyst
 

Mehr von SQALab

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировкуSQALab
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаSQALab
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиSQALab
 
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияSQALab
 
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...SQALab
 
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testingSQALab
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженSQALab
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииSQALab
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовSQALab
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовSQALab
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsSQALab
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеSQALab
 
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииSQALab
 
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеSQALab
 
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестированиеSQALab
 
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"SQALab
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовSQALab
 
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных системSQALab
 
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросSQALab
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...SQALab
 

Mehr von SQALab (20)

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировку
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщика
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
 
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
 
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
 
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testing
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нужен
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихии
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советов
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестов
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIs
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджменте
 
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
 
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
 
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестирование
 
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектов
 
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных систем
 
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопрос
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
 

Реверс инжиниринг схемы данных: кейсы и подходы

  • 1. Реверс-инжиниринг. Восстанавливаем структуру данных Николай Соколовский, Станислав Рождественский
  • 2. Dev1: …у нас есть исходный код, посмотрим там Dev2: [мрачно] в коде лес чудес
  • 3. Когда чаще всего надо реверсить структуру данных? 1. Миграции данных A. Из старой версии в новую B. Из одного продукта в другой (замена продукта) 2. Интеграции с другими приложениями 3. Поддержка приложения 4. Обновление приложения (новые фичи) 5. Переделка приложения (например смена технологии)
  • 4. Общие принципы 1. Все лгут (даже код, даже база). 2. Результат (форма, объем, детальность) должен отвечать цели 3. Все пишется AsIs 4. Документирование – это процесс
  • 5. Что можно использовать как источники информации? Технические: 1. База данных + приложение 2. Документация по проекту (в первую очередь системная) 3. Исходный код (code first) 4. Интервью с техническими stakeholders Бизнес: 1. Нормативная документация 2. Интервью с бизнес Stakeholders Здравый смысл
  • 6. Как это сделать? 1. В базе все очень хорошо и есть доки A. При необходимости дополняем/проверяем документацию скриптами B. генерация схемы (например Diagram MSSQL Managment Studio) C. пачка встреч для верификации, что вы правы 2. В базе все плохо, источников почти что нет A. исследование процессов B. screen mapping + профайлер C. исследование баз D. ручное восстановление структуры E. ручная схема и описание
  • 7. Как найти скрытую логику? 1. Для целых значений: A. Есть ли негативные, нули, положительные B. Диапазон чисел C. не нарушают ли они «смысл» 2. Для дробных значений: A. Действительно ли там дроби? B. Сколько знаков после запятой значимо? C. В какие моменты происходит округление? 3. Даты и время. Какой формат хранения? 4. Для всех связанных таблиц. Есть ли «висячие» строки 5. Действительно ли эта таблица/поле/значение используется сейчас?
  • 8. Хранение наследования Как выглядит нормализованное хранение 1. Для каждого уровня наследования своя таблица 2. Наследники не хранят атрибуты родителя, но хранят его Id 3. Записей в родительских таблицах столько же сколько по сумме во всех отнаследованых от него на всю глубину Как выглядит не нормализованное хранение 1. Одна таблица с 100+ колонок 2. Колонки родителя всегда заполнены, колонки наследника null все, если наследник не задан
  • 9. Как узнать требования к производительности, консистентности, доступности? 1. Есть ли сочетания разных типов БД (RDB, NoSQL etc) 2. Есть ли распределенные базы 3. Есть ли зеркала данных 4. Как организовано бэкапирование и логирование
  • 10. Как выявить риски интеграции данных? 1. Кто еще пишет в нашу базу и куда? 2. Все ли поля он передает, есть ли «закостыленные» значения? 3. Куда мы отдаем данные? 4. Использует ли продовская БД или зеркала/поднятые бэкапы. Каковые лаги по времени?
  • 12. Не нормализованные таблицы Как выглядят 1. В столбцах дублируются атрибуты (reviewer1, reviewer2) 2. После Distinct + order by в строках есть такие же, или почти такие же значения (СПб, СПБ, Питер, Питер. , Санкт-Петербург) 3. Много полей, которые пусты для бОльшей части записей Что можно сделать 1. Если надо – запланировать рефакторинг 2. Нормализовать на уровне логической модели (с указанием маппинга на реальные таблицы)
  • 13. Божественный классификатор Как это выглядит 1. В базе нет справочников 2. Есть странная таблица(ы) с именем вида List, Reference, Dictionary. 3. Данные в этих таблицах не однородны и не содержат признака типа записи. Что можно сделать: 1. Для маппинга составлять справочники выполняя group by в ссылающейся таблице + join на справочник 2. В конце - проверка скриптом не распределенных значений Id Value 1 Палата 101 … … 154 F20.0 Шизофрения … …. 1140 Выписан … … 2240 Стол №3 … …
  • 14. Некорректное удаление данных Как выглядят 1. Одна таблица имеет статус/флаг deleted/Archived другая нет. При этом мы имеем дело с композицией сущностей 2. Left join к ссылающейся с отбором всех удаленных вернет таблицу вида Что можно сделать: 1. Обязательно выяснить причину 2. Учесть при использовании данных MainTable->Id ReferencedTable-Id Null 1 Null 2
  • 15. Мертвые справочники и позиции в них Как это выглядит Join от справочника на все использующие таблицы возвращает null Что можно сделать: 1. Выяснить историю справочника (есть ли исторические данные, используется ли в других системах) 2. Проверить что действительно не используется в существующем коде (у разработчиков) 3. Проверить что не используется более в домене (спросить у бизнеса)
  • 16. Магические числа Как выглядят 1. В поле, которое по сути является справочником, лежат числа. 2. Самого справочника нет как отдельной таблицы Что можно сделать: 1. Восстанавливать значения через код 2. Либо через скриншоты / тестовые прогоны, следя за тем как меняются значения 3. Если надо – запланировать рефакторинг
  • 17. Странные имена Как выглядят 1. Транскрибированные (oborudovanije) 2. Без семантики (Field1) 3. Обманывающие (user = patient) 4. В базе 4 приложения, и нет схем Что можно сделать: 1. Перепроверить семантику и ведение (разработчики + бизнес) 2. Если надо – запланировать рефакторинг
  • 18. Нет ключей (в т.ч. первичных) Как это выглядит Список keys пуст Что можно сделать: 1. Синтаксический анализ (id, FieldId, имя поля совпадает с именем имеющейся таблицы) + опрос разработчиков 2. Анализ view, stored procedure 3. Профайлер
  • 19. Мусорные данные Как выглядит Select field_name, count(field_name) from…. group by field_name Возвращает что-то не укладывающиеся в семантику хранимых данных. Например: 1. Много пустых строк для текстовых полей 2. Не существующий Id в FK: -1, 0 3. Много несуразных дат (01/01/1900) 4. Все забито одними и тем же данными. Например, время всегда – полночь Что можно сделать: 1. Подтвердить расхождения с семантикой 2. Выяснить почему система пишет такие данные
  • 20. Когда часы врут 1. Не верный часовой пояс сервера + хранение информации без указания часового пояса 2. Не используется при реальной необходимости 3. Ложное время Как выглядит 1. Вам об этом сказали 2. Повторяющиеся значения Что можно сделать: 1. Зависит от цели, в целом ничего
  • 21. Суммы не бьются 1. Производные статусы 2. Итоговые суммы Как выглядит 1. Обычное поле 2. Явные указания в логике / коде 3. Однотипные поля в основной и дочерних сущностях Что можно сделать: 1. Перепроверить что вычисления проводились верно на всем наборе данных
  • 22. Спасибо за внимание Соколовский Николай Email: sokolovskynik@gmail.com Facebook: https://www.facebook.com/sokolovskynik Станислав Рождественский Email: Stanislav.Rozhdestvenskiy@dataart.com LinkedIn: https://www.linkedin.com/in/sirojdestvensky