У меня есть родительская таблица "метрики" и дочерняя таблица "ключ-значение".
каждая строка в metrics
может иметь связанные пары "ключ-значение", которые будут храниться в таблице "ключ-значение" (количество пар "ключ-значение" не ограничено, может быть 0 или более)
идентификаторы строк метрик автоматически увеличиваются, а временные метки генерируются sqlite (поскольку допускается несколько метрик в одном экземпляре)
например, я думал о такой схеме:
CREATE TABLE metrics (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT (datetime('now','localtime')),
name TEXT NOT NULL,
);
CREATE TABLE keyvalues(
key TEXT,
value TEXT,
metric_id INTEGER,
CONSTRAINT fk_keyval
FOREIGN KEY(metric_id)
REFERENCES metrics(id)
ON DELETE CASCADE
);
Первичный ключ metric id
— это auto-incremented
, а timestamp
генерируется sqlite, я не уверен, как одновременно вставлять строки как в таблицу показателей, так и в связанную таблицу keyvalues
.
мой внутренний API выглядит следующим образом (псевдокод):
Metric {
name: String,
keyvals: Map<String,String>
}
func count_metric(metric: Metric) {
sqlite.execute("insert into metrics(name) value(metric.name)");
// now how to go about inserting to the `keyvalues` table?
foreach (key,value) in metric.keyvals {
sqlite.execute("insert into keyvalues(key,value,metric_id) values(?,?,?)" , key , value , "rowid") // how do I get the row id efficiantly and ensure correctness if multiple inserts occur conccurently?
}
}
Должен ли я сначала вставить в таблицу метрик, запросить у нее идентификатор последней строки, а затем перейти к вставке в таблицу ключевых значений соответствующих записей?
Вы можете использовать last_insert_rowid():
insert into metrics(name) values(?);
insert into keyvalues(key, value, metric_id) values(?, ?, last_insert_rowid());
при выполнении пакета возникает проблема с этим подходом, поскольку last_insert_row_id() возвращает идентификатор таблицы внешнего ключа. ``` НАЧАТЬ ТРАНЗАКЦИЮ; ВСТАВЬТЕ В метрику (имя) ЗНАЧЕНИЯ («имя1»); INSERT INTO свойства VALUES('f2', 'v2', last_insert_rowid()); INSERT INTO свойства VALUES('f3', 'v3', last_insert_rowid()); СОВЕРШИТЬ; ```