Задать вопрос
  • Как сделать разделение проекта по филиалам?

    @immelnikoff
    Изучаю БД
    Вроде проще пареной репы.
    Создаете таблицу филиал (id, name). А в остальных таблицах, там, где это требуется, определяете внешние ключи на поле id в таблице филиал.
    Ответ написан
    Комментировать
  • Обладает ли декартово произведение свойством дистрибутивности относительно симметрической разности?

    @immelnikoff
    Изучаю БД
    а) Допустим, что (x, y) ∈ A x (B Δ С). Тогда x ∈ A, а y ∈ B Δ С.
    Пусть y ∈ B \ C. Тогда (x, y) ∈ (A x B) \ (A x C).
    Пусть y ∈ C \ B. Тогда (x, y) ∈ (A x C) \ (A x B).
    Следовательно, (x, y) ∈ (A x B) Δ (A x C).
    A x (B Δ С) ⊂ (A x B) Δ (A x C)
    б) Допустим, что (x, y) ∈ (A x B) Δ (A x C). Тогда x ∈ A, а y ∈ B \ C, либо y ∈ B \ C.
    Следовательно y ∈ B Δ С, а (x, y) ∈ A x (B Δ С).
    (A x B) Δ (A x C) ⊂ A x (B Δ С)
    в) A x (B Δ С) ⊂ (A x B) Δ (A x C) и (A x B) Δ (A x C) ⊂ A x (B Δ С) ⇒ A x (B Δ С) = (A x B) Δ (A x C) (по определению равенства).
    Ответ написан
    1 комментарий
  • Как закодировать информацию в определенное количество символов?

    @immelnikoff
    Изучаю БД
    В английском языке всего 26 букв. Итого 52 символа: 26 строчных и 26 прописных букв.
    Если нет никакого ограничения на кодируемую информацию (то есть мы не знаем чего ожидать), то мы можем просто задать свою текстовую кодировку, которая будет представлять поток битов кодируемой информации в символьном виде.
    2⁵ < 52 < 2⁶. Отсюда следует, что 52 символов достаточно, чтобы кодировать каждые 5 бит (использоваться будут только 32 символа) -- 5-битовая кодировка.
    В 15 символах такого текста вы сможете закодировать не более 75 бит информации.
    PS. Оставшиеся 52 - 32 = 20 символов можно использовать для кодирования часто встречающихся последовательностей ранее определенных символов.
    Ответ написан
    Комментировать
  • SELECT внутри запроса DELETE одной таблицы. Как правильно?

    @immelnikoff
    Изучаю БД
    Для MySQL 5.7 и MySQL 8.0:
    Запрос
    DELETE FROM `table` WHERE `idu` = 1 AND `time_end` NOT IN
    (SELECT `time_end` FROM `table` ORDER BY `time_end` DESC LIMIT 3)

    удалит из таблицы все записи с `idu` = 1 кроме трех последних.
    Для MySQL 5.6 и более ранних:
    DELETE FROM `table` WHERE `idu` = 1 AND `time_end` <
    (SELECT * FROM (SELECT `time_end` FROM `table` ORDER BY `time_end` DESC LIMIT 3) as T
    ORDER BY `time_end` LIMIT 1)
    Ответ написан
    7 комментариев
  • Как обойти проблему создания одинаковых кодов?

    @immelnikoff
    Изучаю БД
    промокод вида ААА-0001

    Если первые три символа статичны и меняется только числовая часть, то просто делаете новую таблицу:
    CREATE TABLE promocode(
    id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (user_id) REFERENCES user (id)
    );

    Теперь при
    INSERT INTO promocode (user_id) value (1);
    в поле id будет автоматически генерироваться уникальное целое число, которое можно использовать в качестве промокода.
    ps. Думаю, что данную генерацию уникальных промокодов лучше реализовать именно на стороне БД, так как в этом случае вы точно гарантируете уникальность промокода для каждого юзера.
    Ответ написан
    Комментировать
  • Практика проектирование простых БД?

    @immelnikoff
    Изучаю БД
    Почти в каждом проекте в схеме БД требуется реализовать модель управления доступом.
    Для примера создайте схему, реализующую модель управления доступом на основе ролей (RBAC). В дальнейшем вы сможете использовать этот шаблон для своих будущих проектов.
    Ответ написан
    1 комментарий
  • Как начинающему веб программисту, правильно начать проектировать базы данных?

    @immelnikoff
    Изучаю БД
    Стандартная ситуация, когда полностью отсутствует теоретическая база. Чтобы перестать чувствовать себя слепым котенком, нужно ликвидировать этот пробел. Нужно начать с самых основ – понятие отношения (как ни странно, оно не имеет ничего общего со связями между таблицами), ключи, нормальные формы. Вы должны выучить и понять все 7 нормальных форм и уметь самостоятельно сконструировать таблицу в n-й НФ, но не в n+1-й НФ. А в качестве отдыха следует устранить пробелы в теории множеств, математической логике и системах счисления. Не нужно браться за университетские монографии – это бессмысленно. Вполне достаточно ограничиться школьным курсом математики и информатики. Это может показаться сложным и скучным занятием, но если вы сможете это перетерпеть, то потом наступит облегчение и вы сами удивитесь насколько все логично и упорядочено.
    Ответ написан
    Комментировать
  • Как объединить дубликаты с заменой в дочерних таблицах?

    @immelnikoff
    Изучаю БД
    1. В рамках одной таблицы city это никак не сделать, всё равно придется в дочерних таблицах переставлять значения в Foreign Key с дубликатов на правильный оставшийся город. Можно написать хранимую процедуру, которая будет принимать список дубликатов (а поиск дубликатов предварительно будет осуществляться, например, регуляркой), выбирать единственное верное значение (возможно (и лучше) с вашей подсказкой), во всех дочерних таблицах переставлять значения в Foreign Key на запись с этим значением, а затем удалит дубликаты из city.
    2. UUID нужен для распределенных систем, где нет возможности выполнить проверку уникальности первичного ключа в рамках всей системы или если у вас к базе идет большое кол-во запросов на запись, настолько большое, что СУБД просто не успевает выполнить проверку уникальности первичного ключа для каждой записи. Но, как я понимаю, это не ваш случай. В данном случае вместо 16-байтового UUID лучше использовать автоинкрементное, целочисленное, беззнаковое, 2-байтное поле (city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY). Зачем использовать 16-байтный первичный ключ, когда достаточно 2-байтного? Быстрее будут исполняться JOIN'ы, меньше операций ввода/вывода с диска, меньше требуемого места для хранения на диске.
    Ответ написан
    Комментировать
  • Как перевести этот код C++ на python?

    @immelnikoff
    Изучаю БД
    Как вариант, можно не переводить этот код на Python, а дернуть его из python-кода с помощью cffi.
    Ответ написан
    Комментировать
  • Как сделать проверку столбца типа varchar на уникальность?

    @immelnikoff
    Изучаю БД
    СУБД то какая?
    В MySQL, например, просто создается уникальный индекс:
    CREATE TABLE dic(
    ...
    dic_value VARCHAR(30) NOT NULL UNIQUE
    ...);
    Ответ написан
  • Литература по базам данных?

    @immelnikoff
    Изучаю БД
    Могу посоветовать две очень годные книги для тех, кто действительно хочет разбираться в БД:
    - Системы баз данных. Полный курс, Гектор Гарсиа-Мол...,
    - MySQL по максимуму, Шварц Бэрон, Зайцев Петр, Ткач....
    Книги непростые и начинать нужно не с них.
    Начинать нужно с любой книжки по синтаксису и основ, типа нормальных форм.
    Переходить к данным книгам можно, когда вы освоите синтаксис, разберетесь с устройством всех типов данных и сами сможете сконструировать примеры:
    - таблицы, находящейся в 1НФ, но не в 2НФ,
    - таблицы, находящейся в 2НФ, но не в 3НФ,
    - таблицы, находящейся в 3НФ, но не в НФБК,
    - таблицы, находящейся в НФБК, но не в 4НФ,
    - таблицы, находящейся в 4НФ, но не в 5НФ,
    - таблицы, находящейся в 5НФ, но не в ДКНФ,
    - таблицы, находящейся в ДКНФ, но не в 6НФ.
    Ответ написан
    Комментировать
  • Искажается хеш из MySQL при проверке пароля - как поправить?

    @immelnikoff
    Изучаю БД
    В базе хеши хранятся в поле VARCHAR - длинной 128, кодировка базы - utf8_general_ci

    Я, конечно, извиняюсь, но кто придумал хранить хэш-суммы в поле типа VARCHAR?
    Ответ написан
  • Математика для прогаммиста,база 9 классов?

    @immelnikoff
    Изучаю БД
    Для программирования нужны след. разделы математики:
    - теория множеств,
    - мат. логика,
    - комбинаторика,
    - системы счислений,
    - теория графов,
    - теория вероятностей,
    - теория пределов.
    Хорошему программисту (даже верстальщику) нужно знать хотя бы основы этих разделов. Остальная математика зависит уже от предметной области, в которой вы будете работать.
    Ответ написан
  • Какую базу данных выбрать?

    @immelnikoff
    Изучаю БД
    По сути, почти любую СУБД можно настроить для этих целей.
    Возьмите, например, MySQL 8.0. Ставите сервер MySQL и устанавливаете наинизший уровень изолированности транзакций – READ UNCOMMITED – для отключения MVCC и, соответственно, повышения конкурентности. Этот сервер будет принимать данные на запись.
    Ставите ещё один сервер MySQL – реплику (основной сервер, соответственно, – мастер). К нему будут делаться запросы на чтение.
    Ответ написан
    1 комментарий
  • Ускорить обработку файла?

    @immelnikoff
    Изучаю БД
    from re import sub
    
    pattern = r'^([A-z0-9]*)_([A-z0-9]*)(@.*)?:(.*)$'
    newpattern = r'\1_\2\3:\1'
    resfile = open('result.txt', 'w')
    with open('base.txt') as file:
        for line in file:
            resfile.write(sub(pattern, newpattern, line))
    resfile.close()
    Ответ написан
    Комментировать
  • Как сформировать SQL запрос?

    @immelnikoff
    Изучаю БД
    SELECT * FROM tbl_scan_instance WHERE guid IN
    (SELECT scan_guid FROM tbl_scan_investigation_relationships WHERE investigation_id = xxx);
    Ответ написан
    Комментировать
  • Как правильно сформулировать вопрос mysql?

    @immelnikoff
    Изучаю БД
    Может так:
    SELECT products.name FROM products WHERE LENGTH(products.name) =
    (SELECT max(LENGTH(products.name)) FROM products);
    Ответ написан
    6 комментариев
  • Как считать количество выполненений методов импортированного класса?

    @immelnikoff
    Изучаю БД
    Как вариант:
    def counter(func):  #декоратор-счётчик
        def wrapper(*args, **kwargs):
            global counts
            func(*args, **kwargs)
            counts[func.__name__] = counts.get(func.__name__, 0) + 1
        return wrapper
            
    
    class Car():
        def __init__(self, speed=100):
            self.speed = speed
            
        @counter
        def up_speed(self, delta):
            self.speed += delta
            
        @counter
        def down_speed(self, delta):
            self.speed -= delta  
        
        def __str__(self):
            return 'Current speed equal ' + str(self.speed)
    
    
    counts = dict()
    x = Car()
    print(x)
    x.up_speed(10)
    x.up_speed(20)
    x.up_speed(30)
    x.down_speed(100)
    print(x)
    print(counts)

    Но так придется прописывать декоратор перед каждым методом. Возможно как-то можно сдекорировать класс целиком.
    Ответ написан
    Комментировать
  • Как мне вывести "YES"?

    @immelnikoff
    Изучаю БД
    ...
    if len(name) != 0:
        print('NO')
    else:
        print('YES')


    Я бы решил так:
    name1 = 'BABBONATALE'
    name2 = 'FATHERCHRISTMAS'
    letters = 'BABCHRISTMASBONATALLEFATHER'
    name = name1 + name2
    for letter in letters:
        if letter in name:
            name = name.replace(letter, '', 1)
        else:
            name = 'x'
            break
    if len(name) != 0:
        print('NO')
    else:
        print('YES')

    А ещё лучше так:
    name1 = 'SANTACLAUS'
    name2 = 'DEDMOROZ'
    letters = 'SANTAMOROZDEDCLAUS'
    if sorted(name1 + name2) != sorted(letters):
        print('NO')
    else:
        print('YES')
    Ответ написан
    5 комментариев
  • Прежде чем начать изучать языки программирования?

    @immelnikoff
    Изучаю БД
    ИМХО, перед началом изучения любого языка программирования достаточно разобраться в след. темах:
    – системы счисления,
    – представление чисел на компьютере,
    – текстовые кодировки,
    – основы теории множеств и алгебры логики,
    – понятие о сложности алгоритмов.
    Всё из этого достаточно освоить на уровне средней школы, но твёрдо.
    Всё остальное учится параллельно с языком программирования.
    Ответ написан