нормализация - это серебряная пуля и панацея. Один из ключевых принципов архитектуры.
И не надо ставить денормализацию на одну доску с ней. Это не принцип проектирования баз данных, а компромисс, который никогда не закладывается исходно, а добавляется сильно позже, когда (если) возникают проблемы с производительностью.
Чем схема плоха, я наглядно показал в своем ответе - при нормальной схеме - когда номер счетчика уходит в условие, где он и должен быть - сразу пропадает ВЕСЬ этот говнокод, и делается простой запрос апдейт.
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) как следует из документации самый медленный
Проектируется большая БД (в теори, высоконагруженная частотой запросов) с множеством разных таблиц. Необходимо оптимизировать скорость доступа к одной записи.
Проектируется большая БД (в теори, высоконагруженная частотой запросов) с множеством разных таблиц.
Необходимо оптимизировать скорость доступа к одной записи.
То, что вы предлагаете не нормализация, а переход к EAV, которая применяется при большой вариативности атрибутов, но небольшом их кол-ве для каждой сущности.
Когда необходим поиск по разным столбцам таблицы берут и создают запросы динамически с помощью какого-либо билдера, т.е. "задают имя столбца через переменную". Никто ради этого не переводит таблицу в формат EAV или похожий.
Пока неизвестны все варианты работы с данными однозначно зявить что нужна только какая-то конкретная схема нельзя. Так для EAV адресация будет работать медленней из-за составного ключа, объем хранимых данных также может вырасти, а не уменьшиться, а если окажется, что автору нужно выводить аттрибуты как таблицу, то привет pivot (т.е. столько join, сколько атрибутов будем выводить).
Т.е. если и нужна EAV, то точно не по указанным причинам.