Files
SoundWaveRadio/SUPABASE_TABLE_STRUCTURE.md
2026-02-05 13:47:39 +03:00

7.3 KiB

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

Таблица Category

SQL для создания таблицы

CREATE TABLE Category (
    id INT PRIMARY KEY,
    category_name TEXT NOT NULL,
    category_image TEXT,
    category_status TEXT,
    featured BOOLEAN DEFAULT false,
    last_update TIMESTAMP DEFAULT NOW()
);

Описание полей

Поле Тип Обязательное Описание
id INT Да Уникальный идентификатор категории
category_name TEXT Да Название категории
category_image TEXT Нет URL изображения категории
category_status TEXT Нет Статус категории (active, inactive и т.д.)
featured BOOLEAN Нет Флаг избранной категории
last_update TIMESTAMP Нет Дата и время последнего обновления

Пример данных

INSERT INTO Category (id, category_name, category_image, category_status, featured, last_update) VALUES
(1, 'Rock', 'https://example.com/images/rock.jpg', 'active', true, NOW()),
(2, 'Pop', 'https://example.com/images/pop.jpg', 'active', true, NOW()),
(3, 'Jazz', 'https://example.com/images/jazz.jpg', 'active', false, NOW()),
(4, 'Classical', 'https://example.com/images/classical.jpg', 'active', false, NOW()),
(5, 'Electronic', 'https://example.com/images/electronic.jpg', 'active', true, NOW());

Таблица Radio

SQL для создания таблицы

CREATE TABLE Radio (
    id INT PRIMARY KEY,
    category_id INT,
    radio_name TEXT NOT NULL,
    radio_image TEXT,
    radio_url TEXT NOT NULL,
    radio_status TEXT,
    view_count INT DEFAULT 0,
    featured BOOLEAN DEFAULT false,
    type TEXT,
    last_update TIMESTAMP DEFAULT NOW(),
    FOREIGN KEY (category_id) REFERENCES Category(id) ON DELETE SET NULL
);

Описание полей

Поле Тип Обязательное Описание
id INT Да Уникальный идентификатор радиостанции
category_id INT Нет ID категории (внешний ключ на Category.id)
radio_name TEXT Да Название радиостанции
radio_image TEXT Нет URL изображения радиостанции
radio_url TEXT Да URL потока радиостанции
radio_status TEXT Нет Статус радиостанции (active, inactive и т.д.)
view_count INT Нет Количество просмотров/прослушиваний
featured BOOLEAN Нет Флаг избранной радиостанции
type TEXT Нет Тип радиостанции (live, podcast и т.д.)
last_update TIMESTAMP Нет Дата и время последнего обновления

Пример данных

INSERT INTO Radio (id, category_id, radio_name, radio_image, radio_url, radio_status, view_count, featured, type, last_update) VALUES
(1, 1, 'Rock FM', 'https://example.com/images/rockfm.jpg', 'http://stream.rockfm.com/live', 'active', 0, true, 'live', NOW()),
(2, 1, 'Classic Rock Radio', 'https://example.com/images/classicrock.jpg', 'http://stream.classicrock.com/live', 'active', 0, false, 'live', NOW()),
(3, 2, 'Pop Hits', 'https://example.com/images/pophits.jpg', 'http://stream.pophits.com/live', 'active', 0, true, 'live', NOW()),
(4, 2, 'Top 40', 'https://example.com/images/top40.jpg', 'http://stream.top40.com/live', 'active', 0, false, 'live', NOW()),
(5, 3, 'Smooth Jazz', 'https://example.com/images/smoothjazz.jpg', 'http://stream.smoothjazz.com/live', 'active', 0, true, 'live', NOW()),
(6, 4, 'Classical Music', 'https://example.com/images/classical.jpg', 'http://stream.classical.com/live', 'active', 0, false, 'live', NOW()),
(7, 5, 'Electronic Beats', 'https://example.com/images/electronic.jpg', 'http://stream.electronic.com/live', 'active', 0, true, 'live', NOW());

Индексы для оптимизации

-- Индекс для быстрого поиска по категории
CREATE INDEX idx_radio_category_id ON Radio(category_id);

-- Индекс для поиска по имени радиостанции
CREATE INDEX idx_radio_name ON Radio(radio_name);

-- Индекс для фильтрации по статусу
CREATE INDEX idx_radio_status ON Radio(radio_status);
CREATE INDEX idx_category_status ON Category(category_status);

-- Индекс для избранных
CREATE INDEX idx_radio_featured ON Radio(featured);
CREATE INDEX idx_category_featured ON Category(featured);

Политики безопасности (RLS)

-- Включить Row Level Security
ALTER TABLE Category ENABLE ROW LEVEL SECURITY;
ALTER TABLE Radio ENABLE ROW LEVEL SECURITY;

-- Разрешить всем читать категории
CREATE POLICY "Allow public read access on Category"
ON Category FOR SELECT
USING (true);

-- Разрешить всем читать радиостанции
CREATE POLICY "Allow public read access on Radio"
ON Radio FOR SELECT
USING (true);

-- Разрешить обновление счетчика просмотров
CREATE POLICY "Allow update view_count on Radio"
ON Radio FOR UPDATE
USING (true)
WITH CHECK (true);

Запросы для проверки данных

Получить все категории

SELECT * FROM Category ORDER BY category_name;

Получить все радиостанции

SELECT * FROM Radio ORDER BY radio_name;

Получить радиостанции по категории

SELECT r.*
FROM Radio r
WHERE r.category_id = 1
ORDER BY r.radio_name;

Получить категории с количеством радиостанций

SELECT
    c.id,
    c.category_name,
    c.category_image,
    COUNT(r.id) as radio_count
FROM Category c
LEFT JOIN Radio r ON c.id = r.category_id
GROUP BY c.id, c.category_name, c.category_image
ORDER BY c.category_name;

Получить избранные радиостанции

SELECT * FROM Radio
WHERE featured = true
ORDER BY view_count DESC;

Поиск радиостанций по имени

SELECT * FROM Radio
WHERE radio_name ILIKE '%rock%'
ORDER BY radio_name;

Миграция данных (если есть старая база)

Если у вас есть данные в старом формате, используйте следующие запросы для миграции:

Из старой таблицы category

INSERT INTO Category (id, category_name, category_image, category_status, featured)
SELECT
    cid as id,
    category_name,
    category_image,
    'active' as category_status,
    false as featured
FROM old_category_table;

Из старой таблицы radio

INSERT INTO Radio (id, category_id, radio_name, radio_image, radio_url, radio_status, view_count, type)
SELECT
    id::INT,
    category::INT as category_id,
    name as radio_name,
    image as radio_image,
    url as radio_url,
    'active' as radio_status,
    views as view_count,
    type
FROM old_radio_table;