нормализация - это серебряная пуля и панацея. Один из ключевых принципов архитектуры.
И не надо ставить денормализацию на одну доску с ней. Это не принцип проектирования баз данных, а компромисс, который никогда не закладывается исходно, а добавляется сильно позже, когда (если) возникают проблемы с производительностью.
Чем схема плоха, я наглядно показал в своем ответе - при нормальной схеме - когда номер счетчика уходит в условие, где он и должен быть - сразу пропадает ВЕСЬ этот говнокод, и делается простой запрос апдейт.
UPDATE `list`
SET count1 = CASE WHEN id = ? AND ? = 1 THEN count1 - ? ELSE count1 END,
count2 = CASE WHEN id = ? AND ? = 2 THEN count2 - ? ELSE count2 END,
count3 = CASE WHEN id = ? AND ? = 3 THEN count3 - ? ELSE count3 END
WHERE id = ?
UPDATE `list`
SET count1 = CASE WHEN id = :id_part1 AND :id_part2 = 1 THEN count1 - :count ELSE count1 END,
count2 = CASE WHEN id = :id_part1 AND :id_part2 = 2 THEN count2 - :count ELSE count2 END,
count3 = CASE WHEN id = :id_part1 AND :id_part2 = 3 THEN count3 - :count ELSE count3 END
WHERE id = :id_part1
const COLUMNS = [
1 => 'column1',
2 => 'column2',
3 => 'column3',
];
$column = COLUMNS[$id[1]];
UPDATE `list` SET $column = $column - :count WHERE `id` = :id_part1
$column = 'count' . (int)$columnNumber;
const COLUMNS = [
1 => 'column1',
2 => 'column2',
3 => 'column3',
];
if (!isset(COLUMNS[$id])) {
throw new \InvalidColumnException();
}
$column = COLUMNS[$id];
Я не админ, так понимаю лежит сервер БД
Type character(N) is a hangover from the days of punched cards.
Don't use it. It has weird semantics concerning trailing spaces,
which are almost never the behavior you actually want, and cause
interoperability issues with type text. (Text is Postgres' native
string type, meaning that unlabeled string constants will tend to
get resolved to that.)
contract_address character(42) NOT NULL,
buyer_address character(42) NOT NULL,
seller_address character(42) NOT NULL,
По поводу памяти это экономия на спичках использовать VARCHAR или за этим следят?
varchar и text - по факту одно и то же, а char(n) как следует из документации самый медленный
Проектируется большая БД (в теори, высоконагруженная частотой запросов) с множеством разных таблиц. Необходимо оптимизировать скорость доступа к одной записи.
Вы описываете решение, а не задачу. А про задачу спрашивают, потому что зная ее, возможно, решать надо другим способом. Так, я не вижу причин, почему бы ws-сокет демону не работать постоянно, на то он и демон.
Выглядит очень странно, но в чем проблема? Пришел запрос по http - запускаете демона, демон видит, что все отключились - закрывается.
Дополнительно, нужно посмотреть как настроить systemd unit, чтобы он перезапускался только при ошибке. И если клиент отвалился некорректно, то контролировать это, либо забить, если быстрая реакция не важна.