У меня есть база данных, которую я создаю.
Он должен содержать пару десятков таблиц с предоставленными нами записями (куча значений по умолчанию), а также записи, которые может добавить пользователь. Чтобы пользователь не мог выстрелить себе в ногу, необходимо запретить ему изменять записи по умолчанию.
Есть много способов облегчить это, но мне нравится идея давать защищенным записям отрицательные целочисленные индексы, сохраняя при этом 0 в качестве недопустимого идентификатора записи и предоставляя пользовательским записям положительные целые индексы.
CREATE TABLE t1 (
ixt1 integer AUTOINCREMENT,
d1 double,
CONSTRAINT pk_ixt1 PRIMARY KEY (ixt1),
CONSTRAINT ch_zero CHECK (ixt1 <> 0)
);
-2 | 171.3 <- canned record
-1 | 100.0 <- canned record
1 | 666.6 <- user record
Причины этого кажутся хорошими:
он не занимает значительно больше места
это легко понять
для реализации не требуется много дополнительных таблиц
"select * from table" получает все соответствующие записи без дополнительного косвенного обращения
постоянные записи могут расти в отрицательном направлении, а пользовательские записи могут расти в положительном направлении
Однако я относительно новичок в проектировании баз данных. И после некоторого использования этого решения я начинаю беспокоиться, что использование отрицательных индексов может быть плохим, потому что
Отрицательные индексы могут не поддерживаться согласованно между различными СУБД, что затрудняет написание кода, независимого от базы данных
Может быть, слишком просто все испортить, вставив что-то в recid 0
Это может затруднить использование инструментов (например, сеток БД), которые ожидают целочисленные индексы с неотрицательными значениями.
И, возможно, есть и другие действительно очевидные причины, которые сделали бы эту идею очень плохой.
Так каков окончательный ответ? Являются ли отрицательные целочисленные индексы злыми?