1.9.9.8
This commit is contained in:
@@ -0,0 +1,210 @@
|
||||
# Структура таблиц Supabase
|
||||
|
||||
## Таблица Category
|
||||
|
||||
### SQL для создания таблицы
|
||||
```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 | Нет | Дата и время последнего обновления |
|
||||
|
||||
### Пример данных
|
||||
```sql
|
||||
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 для создания таблицы
|
||||
```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 | Нет | Дата и время последнего обновления |
|
||||
|
||||
### Пример данных
|
||||
```sql
|
||||
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());
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Индексы для оптимизации
|
||||
|
||||
```sql
|
||||
-- Индекс для быстрого поиска по категории
|
||||
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)
|
||||
|
||||
```sql
|
||||
-- Включить 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);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Запросы для проверки данных
|
||||
|
||||
### Получить все категории
|
||||
```sql
|
||||
SELECT * FROM Category ORDER BY category_name;
|
||||
```
|
||||
|
||||
### Получить все радиостанции
|
||||
```sql
|
||||
SELECT * FROM Radio ORDER BY radio_name;
|
||||
```
|
||||
|
||||
### Получить радиостанции по категории
|
||||
```sql
|
||||
SELECT r.*
|
||||
FROM Radio r
|
||||
WHERE r.category_id = 1
|
||||
ORDER BY r.radio_name;
|
||||
```
|
||||
|
||||
### Получить категории с количеством радиостанций
|
||||
```sql
|
||||
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;
|
||||
```
|
||||
|
||||
### Получить избранные радиостанции
|
||||
```sql
|
||||
SELECT * FROM Radio
|
||||
WHERE featured = true
|
||||
ORDER BY view_count DESC;
|
||||
```
|
||||
|
||||
### Поиск радиостанций по имени
|
||||
```sql
|
||||
SELECT * FROM Radio
|
||||
WHERE radio_name ILIKE '%rock%'
|
||||
ORDER BY radio_name;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Миграция данных (если есть старая база)
|
||||
|
||||
Если у вас есть данные в старом формате, используйте следующие запросы для миграции:
|
||||
|
||||
### Из старой таблицы category
|
||||
```sql
|
||||
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
|
||||
```sql
|
||||
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;
|
||||
```
|
||||
Reference in New Issue
Block a user