Python.

И СУБД.

Лекция #8

Почему важно отмечаться на лекции?

notebook.ipynb

Рейтинг популярности

Где хранить данные? 

  • На диске (HDD, SSD)
  • В памяти (in-memory)

Модель хранения данных

  • Реляционные бд
  • Документ-ориентированные
  • Key-value хранилища
  • Графовые базы данных
  • Time series
  • Поисковые движки
  • Другие

CAP-теорема

  • Consistency
  • Availability
  • Partition tolerance

Определение

Общие понятия

  • Язык запросов
  • Индексы
  • Транзакции
  • ACID
  • Миграции

Способы масштабирования

  • Вертикальное
  • Горизонтальное

Репликация

Шардинг

Популярность

Реляционные бд

Таблицы, столбцы, строки

SQL

SELECT * FROM users;

INSERT INTO users (name, address) 
VALUES ('Alexander','Stavanger, Norway');

UPDATE users SET address="Moscow, Russia" 
WHERE name="Alexander";

DELETE FROM users WHERE name="Alexander";

Первичные ключи

(Primary Key)

CREATE TABLE users (
    id int NOT NULL AUTO_INCREMENT,
    name varchar(255) NOT NULL,
    address varchar(255),
    PRIMARY KEY (id)
);

Уникально определяет каждую запись в таблице

Внешние ключи (Foreign Key)

Основной примитив отношений - поле, ссылающееся на первичный ключ другой таблицы

CREATE TABLE City
(
  id   INTEGER NOT NULL PRIMARY KEY,
  name CHAR(40)
)

CREATE TABLE Street
(
  id      INTEGER NOT NULL PRIMARY KEY,
  name    CHAR(40),
  id_city INTEGER NOT NULL FOREIGN KEY REFERENCES City(id)
)

Отношения (relations)

  • Один к одному (One to One)
  • Один ко многим/многие к одному (One to Many/Many to One)
  • Многие ко многим (Many to Many)

JOINS

user:

course:

https://www.sitepoint.com/understanding-sql-joins-mysql-database/

INNER JOIN (JOIN)

SELECT user.name, course.name
FROM `user`
INNER JOIN `course` on user.course = course.id;

LEFT JOIN

SELECT user.name, course.name
FROM `user`
LEFT JOIN `course` on user.course = course.id;

Python – работа с реляционными бд

  • Нативные коннекторы (mysqlclient, sqlite3, psycopg2). DB API 2.0
  • ORM (SQLAlchemy, Peewee, Django ORM)

Document-oriented

Преимущества

  • Отсутствие схемы (хранение только нужных атрибутов, гибкость)
  • Возможность быстрой записи
  • Проще шардировать данные

Эти преимущества могут быть и недостатками - "know your business"

PyMongo

from pymongo import MongoClient

client = MongoClient()
db = client.test

result = db.restaurants.insert_one(
    {
        "address": {
            "street": "2 Avenue",
            "zipcode": "10075",
            "building": "1480",
            "coord": [-73.9557413, 40.7720266]
        },
        "grades": ["A", "B"]
    }
)

cursor = db.restaurants.find({"address.zipcode": "10075"})

Поисковые движки

Time-series

Отправка в Graphite

import socket
import time

CARBON_SERVER = '127.0.0.1'
CARBON_PORT = 2003

ts = int(time.time()
message = 'passkeeper.response_time 420 %d\n' % ts)

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((CARBON_SERVER, CARBON_PORT))
sock.sendall(message)
sock.close()

Grafana

Column-oriented

Преимущества

cassandra-driver

from cassandra.cluster import Cluster
from cassandra.policies import RoundRobinPolicy
from cassandra.query import SimpleStatement

cluster = Cluster(
    ['10.1.1.3', '10.1.1.4', '10.1.1.5'],
    load_balancing_policy=RoundRobinPolicy(),
    port=9042)

session = cluster.connect('mykeyspace')

rows = session.execute('SELECT name, age, email FROM users')
for user_row in rows:
    print user_row.name, user_row.age, user_row.email

query = SimpleStatement(
    "INSERT INTO users (name, age) VALUES (%s, %s)",
    consistency_level=ConsistencyLevel.QUORUM)

session.execute(query, ('John', 42))

Key-value

Другие интересные бд

  • RocksDB
  • CockroachDB
  • Tarantool
  • Aerospike

Python – работа с NoSQL бд

Свой коннектор для каждой базы данных, никакой абстракции

Спасибо!

Python_10

By Emelin Alexander

Python_10

  • 1,011