【发布时间】:2011-01-04 17:53:19
【问题描述】:
我正在设计这个数据库。
它需要包含几十个表,其中包含我们提供的记录(一堆默认值)以及用户可以添加的记录。为了不让用户中弹,有必要不让他修改默认记录。
有很多方法可以促进这一点,但我喜欢为受保护记录提供负整数索引,同时保留 0 作为无效记录 ID 并为用户记录提供正整数索引的想法。
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”获取所有相关记录,无需额外间接
罐头记录可以负向增长,用户记录可以正向增长
但是,我对数据库设计还比较陌生。在使用这个解决方案一段时间后,我开始担心使用负索引可能不好,因为
不同 DBMS 之间可能无法一致支持负索引,因此难以编写与数据库无关的代码
在 recid 0 处插入一些东西可能太容易搞砸了
这可能会导致难以使用期望具有非负值的整数索引的工具(可能像 db 网格)。
也许还有其他一些非常明显的原因会使这成为一个非常糟糕的主意。
那么最终的答案是什么?负整数索引是邪恶的吗?
【问题讨论】:
-
我注意到您的主键上有
AUTOINCREMENT,这最终如何与您的策略配合使用?您是手动计算所有新记录的正确主键还是只计算私有(负)记录? -
只有私有(负)密钥会被显式设置。顺便说一句,我不知道这种特殊的 SQL 语法适用于任何 DBMS。这只是为了说明。
标签: sql database-design indexing