То, чего нет в других СУБД
● Range
● Array
● JSON
Нагло вру!
На самом деле, в
MySQL есть JSON
Slide 3
Slide 3 text
Range
int4range, int8range — диапазон целых чисел
[1, 10]
numrange — диапазон вещественных чисел
[1.3278, 3.3498]
tsrange, tstzrange — диапазоны даты и времени
[‘2014-01-14 09:00:00’, ‘2014-01-14 09:00:00’]
daterange — диапазон дат
[‘2013-01-14’, ‘2014-01-15’]
В Ruby эта запись
смотрелась бы вот так:
1..10
А эта вот так:
14 Jan 2013..15 Jan 2014
Slide 4
Slide 4 text
Диапазоны
(1, 10) - от двух до девяти
(1, 10] - от двух до десяти
[1, 10) - от единицы до девяти
[1, 10] - от единицы до десяти
empty - пустой диапазон
Добавление записи с dates_range
SQL:
INSERT INTO my_table (my_range) VALUES('[2014-01-14, 2014-01-15]');
или
INSERT INTO my_table (my_range)
VALUES('(2014-01-13, 2014-01-17]'::daterange);
Если вы хотите указать, какие границы
включить в диапазон, а какие нет
Slide 7
Slide 7 text
ActiveRecord:
range = Date.today..(Date.today + 1.day)
record = MyTable.create(my_range: range)
puts record.my_range
#=> 14 Feb 2014...Mon, 16 Feb 2014
Добавление записи с daterange
в базе данных хранится значение
[‘2014-01-14’, ‘2014-01-16’)
Slide 8
Slide 8 text
Изменение границ диапазонов при
создании записи
[1, 5] [1, 6)
[1, 5) [1, 5)
(1, 5] [2, 6)
(1, 5) [2, 5)
Slide 9
Slide 9 text
Функции выборки
всем известные функции:
=, <> - равно / не-равно
<, >, <=, >= - меньше / больше
Slide 10
Slide 10 text
@> - содержит ли range другой range
int4range(1, 10) @> int4range(3, 7) -- true
int4range(3, 7) @> int4range(1, 10) -- false
или элемент
int4range(2,4) @> 3 -- true
int4range(2,4) @> 28 -- false
и его аналог наоборот: <@
Функции выборки
Slide 11
Slide 11 text
&& - пересекаются ли два range:
int4range(2,4) && int4range(2,3) -- true
int4range(2,4) && int4range(5,8) -- false
Функции выборки
Slide 12
Slide 12 text
<< - какой из range слева, а какой справа
int8range(1, 10) << int8range(100, 110) -- true
int8range(200, 300) << int8range(100, 110) -- false
и его собрат >>, выполняющий все с
точностью до наоборот
Функции выборки
Slide 13
Slide 13 text
объединение
numrange(5,15) + numrange(10,20)
#=> [5,20)
пересечение
int8range(5,15) * int8range(10,20)
#=> [10,15)
разность
int8range(5,15) - int8range(10,20)
#=> [5,10)
Функции выборки
Slide 14
Slide 14 text
Примеры для ActiveRecord
MyTable.where(‘my_range @> date(?)', Date.today)
# SELECT * FROM "my_tables" WHERE (dates_range @> date('2014-01-15'))
Slide 15
Slide 15 text
Array
integer[] - одномерный массив целых чисел
integer[][] - а это уже двумерный
xml[], hstore[], text[] - Почти любой тип данных Postgresql можно
запихнуть в массив
Добавление записи с массивом
SQL:
INSERT INTO my_table (my_array) VALUES('{1, 3, 4}');
ActiveRecord:
MyTable.create(my_array: [1, 3, 4])
Ага, именно так выглядит в массив
в PostgreSQL