У меня есть данные геолокации с метками времени и некоторая другая информация о пользователях, и я ищу совет по проектированию базы данных. Я предполагаю, что наивный дизайн будет:
CREATE TABLE user(
user_id INT NOT NULL,
name VARCHAR(128) NOT NULL,
gender VARCHAR(128) NOT NULL,
age INT NOT NULL,
time TIMESTAMPTZ NOT NULL,
xloc FLOAT(4) NOT NULL,
yloc FLOAT(4) NOT NULL,
PRIMARY KEY(user_id),
);
Здесь xloc, yloc
- это числа с плавающей точкой, указывающие местоположение. Очевидная проблема с этой таблицей заключается в том, что поля gender
, age
и name
будут избыточно повторяться много раз для каждой временной отметки. Прочитав исчерпывающий принятый ответ в Хранение данных временных рядов, реляционных или не относящихся к? Я решил, что лучшим решением было бы иметь данные геолокации в отдельной таблице, т.е. иметь две таблицы:
CREATE TABLE geodata(
user_id INT NOT NULL,
time TIMESTAMPTZ NOT NULL,
xloc FLOAT(4) NOT NULL,
yloc FLOAT(4) NOT NULL,
PRIMARY KEY (user_id, time),
);
CREATE TABLE user(
user_id INT NOT NULL,
name VARCHAR(128) NOT NULL,
gender VARCHAR(128) NOT NULL,
age INT NOT NULL,
PRIMARY KEY (user_id),
);
Обратите внимание, что в таблице geodata
я использую user_id
и time
в качестве PK, чтобы попытаться соответствовать Шестая нормальная форма (6NF) , как указано в ответе выше. ссылка - это, по-видимому, обеспечивает более высокую производительность. Строго говоря, для 6NF требуется только один другой атрибут для каждого PK
, но в моем случае у меня есть два (xloc
и yloc
). Последние версии PostgreSQL позволяют использовать типы массивов , поэтому другой вариант будет:
CREATE TABLE geodata(
user_id INT NOT NULL,
time TIMESTAMPTZ NOT NULL,
loc FLOAT(4) ARRAY[2] NOT NULL,
PRIMARY KEY (user_id, time),
);
В этом случае клиент должен знать, что массив представляет местоположения x
и y
, в этом порядке, но пока это не проблема. В настоящее время таблица технически имеет только один атрибут на ПК, но меня больше интересует его производительность. Я новичок в Postgres и БД в целом. Будет ли использование типов массивов лучше с точки зрения производительности?
Данные и сценарий использования: Временные ряды местоположений для каждого пользователя могут быть длиной в десятки миллионов измерений и с различными интервалами. read ops превысит число write ops - на самом деле сейчас мои данные статичны, и полученная база данных будет использоваться небольшой командой для статистического анализа, по крайней мере, на данный момент.
Мои запросы будут, например, измерения для пользователей мужского пола или воскресные измерения для пользователей младше 30 с .
Какие альтернативные проекты вы бы порекомендовали?