← Назад к вопросам

Что такое таблица в БД?

2.7 Senior🔥 111 комментариев
#Spring Boot и Spring Data#Многопоточность#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Таблица в базе данных

Таблица в базе данных — это основная структура для организации и хранения данных. Таблица представляет собой двумерную структуру, состоящую из строк (records) и столбцов (columns), где каждая ячейка содержит конкретное значение данных.

Структура таблицы

Таблица состоит из:

  • Столбцы (Columns) — вертикальные элементы, каждый имеет имя и тип данных
  • Строки (Rows) — горизонтальные элементы, каждая представляет отдельную запись
  • Ячейки — пересечение строки и столбца, содержащее одно значение
┌──────────┬──────────┬──────────┬──────────┐
│    ID    │   Name   │   Email  │    Age   │
├──────────┼──────────┼──────────┼──────────┤
│    1     │  John    │ j@ex.com │    25    │  <- Строка 1
├──────────┼──────────┼──────────┼──────────┤
│    2     │  Jane    │ j@ex.com │    30    │  <- Строка 2
├──────────┼──────────┼──────────┼──────────┤
│    3     │  Bob     │ b@ex.com │    28    │  <- Строка 3
└──────────┴──────────┴──────────┴──────────┘
  ↑         ↑          ↑          ↑
  Столбец 1 Столбец 2  Столбец 3  Столбец 4

Создание таблицы

Таблица создаётся с помощью SQL команды CREATE TABLE:

// SQL для создания таблицы
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    age INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

В Java при работе с базой данных:

import java.sql.Connection;
import java.sql.Statement;
import java.sql.DriverManager;

public class TableCreation {
    public static void main(String[] args) {
        String sql = "CREATE TABLE IF NOT EXISTS users (" +
                     "id INT PRIMARY KEY AUTO_INCREMENT," +
                     "name VARCHAR(100) NOT NULL," +
                     "email VARCHAR(100) UNIQUE," +
                     "age INT," +
                     "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP" +
                     ")";  
        
        try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password");
             Statement stmt = conn.createStatement()) {
            stmt.execute(sql);
            System.out.println("Table created successfully");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Основные компоненты таблицы

1. Столбцы (Columns)

Каждый столбец имеет:

  • Имя — уникальный идентификатор в пределах таблицы
  • Тип данных — определяет, какие значения хранятся (INT, VARCHAR, DATE и т.д.)
  • Ограничения — правила для данных (NOT NULL, UNIQUE, DEFAULT и т.д.)
// Типы данных SQL
INT              // Целые числа
VARCHAR(255)     // Переменная строка длиной до 255 символов
DECIMAL(10,2)    // Числа с плавающей точкой
BOOLEAN          // Логический тип (true/false)
DATE             // Дата (YYYY-MM-DD)
TIMESTAMP        // Дата и время
TEXT             // Большой текст
BLOB             // Бинарные данные

2. Первичный ключ (Primary Key)

Одна или несколько колонок, однозначно идентифицирующие каждую строку:

CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2)
);

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

Создаёт связь между таблицами:

CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    product_id INT,
    quantity INT,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (product_id) REFERENCES products(id)
);

Основные операции с таблицами

1. INSERT — добавление данных

String sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";

try (Connection conn = getConnection();
     PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setString(1, "John Doe");
    pstmt.setString(2, "john@example.com");
    pstmt.setInt(3, 25);
    pstmt.executeUpdate();
}

2. SELECT — чтение данных

String sql = "SELECT id, name, email, age FROM users WHERE age > ?";

try (Connection conn = getConnection();
     PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setInt(1, 18);
    try (ResultSet rs = pstmt.executeQuery()) {
        while (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            String email = rs.getString("email");
            int age = rs.getInt("age");
            System.out.println(id + " " + name + " " + email + " " + age);
        }
    }
}

3. UPDATE — изменение данных

String sql = "UPDATE users SET age = ? WHERE id = ?";

try (Connection conn = getConnection();
     PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setInt(1, 26);
    pstmt.setInt(2, 1);
    pstmt.executeUpdate();
}

4. DELETE — удаление данных

String sql = "DELETE FROM users WHERE id = ?";

try (Connection conn = getConnection();
     PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setInt(1, 1);
    pstmt.executeUpdate();
}

Индексы

Индексы ускоряют поиск данных:

CREATE INDEX idx_email ON users(email);
CREATE UNIQUE INDEX idx_username ON users(name);

// Удаление индекса
DROP INDEX idx_email ON users;

Ограничения таблицы

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,           // НЕ может быть NULL
    email VARCHAR(100) UNIQUE,            // Уникальное значение
    age INT CHECK (age >= 18),            // Проверка условия
    salary DECIMAL(10, 2) DEFAULT 0,      // Значение по умолчанию
    department_id INT REFERENCES departments(id)  // Внешний ключ
);

Связи между таблицами

One-to-Many (Один ко многим)

Departments: 1 ----< N : Employees

Many-to-Many (Многие ко многим)

Students >----< N : M : <----< Courses

Нормализация таблиц

Нормализация — процесс проектирования таблиц для минимизации дублирования данных:

Первая нормальная форма (1NF):

  • Все значения в столбце атомарны (неделимы)
  • Нет повторяющихся групп

Вторая нормальная форма (2NF):

  • Удовлетворяет 1NF
  • Все неключевые атрибуты зависят от полного первичного ключа

Третья нормальная форма (3NF):

  • Удовлетворяет 2NF
  • Нет зависимостей между неключевыми атрибутами

Пример проектирования БД

// Таблица: users
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

// Таблица: posts
CREATE TABLE posts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    title VARCHAR(200) NOT NULL,
    content TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

// Таблица: comments
CREATE TABLE comments (
    id INT PRIMARY KEY AUTO_INCREMENT,
    post_id INT NOT NULL,
    user_id INT NOT NULL,
    content TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

Таблицы — фундамент любой базы данных. Правильное проектирование таблиц обеспечивает эффективное хранение, быстрый поиск и целостность данных