Бази данни

06.01.2014

Бази данни: Кратка история

Видове схеми (schema)

(Схема - структурата на една база данни)

Фиксирана схема

Но...

Видове схеми 2

Динамична схема

Но...

Защо релационни бази данни?

Релационни бази данни с Go

Пакетът database/sql се стреми да предостави унифициран интерфейс към тях

database/sql

Типове за:

+ известно количество помощтни функции

Създаване на връзка към база

db, err := sql.Open(driver, dataSourceName)

Вярвате или не това не отваря директно връзка...

докато това не е нужно.

Изпълняване на заявки

result, err := db.Exec(
    "INSERT INTO users (name, age) VALUES (?, ?)",
    "gopher",
    27,
)

Ако очакваме резултат

var age int64
row := db.QueryRow("SELECT age FROM users WHERE name = ?", name)
err := row.Scan(&age)

Ако очакваме резултатИ

rows, err := db.Query("SELECT name FROM users WHERE age = ?", age)
if err != nil {
    log.Fatal(err)
}
for rows.Next() {
    var name string
    if err := rows.Scan(&name); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s is %d\n", name, age)
}
if err := rows.Err(); err != nil {
    log.Fatal(err)
}

Statements

age := 27
stmt, err := db.Prepare("SELECT name FROM users WHERE age = ?")
if err != nil {
    log.Fatal(err)
}
rows, err := stmt.Query(age)
// process rows

Транзакции

tx, err := db.Begin()
if err != nil {
    log.Fatal(err)
}

Всяка транзакция трябва да приключи с Commit или Rollback

Справяне с null

var name NullString
err := db.QueryRow("SELECT name FROM names WHERE id = ?", id).Scan(&name)
...
if name.Valid {
    // има валидна стойност в name.String
} else {
    // NULL
}

Драйвери

-...

ORM

Но...

Key-value Stores

Имате всичко на всичко две операции:

Документни бази данни

Mongo

Как се казват нещата в Mongo

Типове данни

Операции

Модификатори

Репликация

Ключове и стойности

Tiedot

Едни надъхани типове са решили да си направят собствена NoSQL база данни:

Между нас казано, не вярваме, че става за нещо...

Въпроси?