【发布时间】:2009-07-20 15:54:46
【问题描述】:
我正在尝试使用大量表和强制关系构建用于库存控制的数据库,但我刚刚遇到了 Access 表的 32 个关系(索引)限制(使用 Access 2007)。
澄清一下:问题不在于Employees 表有32 个显式索引。相反,问题在于 Employee 表可以在 FOREIGN KEY 约束中被引用的次数的限制。例如:
CREATE TABLE Employees (employee_number INTEGER NOT NULL UNIQUE)
;
CREATE TABLE Table01 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number))
;
CREATE TABLE Table02 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number))
;
CREATE TABLE Table03 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number))
;
...
CREATE TABLE Table30 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number))
;
CREATE TABLE Table31 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number))
;
CREATE TABLE Table32 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number))
;
上面最后一行抛出异常,“无法创建索引;定义了太多索引。
我有什么办法可以解决这个限制?
我听说创建具有 1:1 关系的重复表是一种方法。我是数据库设计的新手,所以如果我错了,请纠正我;但是给定一个具有 31 个索引的表Employees,我将创建一个表Employees2(带有一个字段?),它与Employees 有1:1 的关系,并且与EmployeeID 是外键的任何剩余关系的关系到这个新表。确保第二个表与第一个表一起填充的最佳方法是什么?
还有其他方法吗?
由于缺乏可用信息,这似乎是一个设计合理的数据库的罕见问题,或者解决方案是常识。原谅菜鸟!
更新:立即达成共识是我的设计很无聊或过于雄心勃勃。很可能就是这种情况。但是,我宁愿在一个单独的问题中进行一般设计讨论,所以为了争论,有人可以回答这个问题吗?如果答案只是“永远不要那样做”,我将不得不接受它。
【问题讨论】:
-
我想你会发现你的整体设计是错误的。否则无法满足此特定限制。
-
“整体设计有问题”是错误的。我有很多系统遇到过这个问题。
-
@Tony:啊!感谢您的洞察力。但是我必须指出,我们的询问者说他是“数据库设计新手”......
-
我从未遇到过类似的情况。我不得不认为设计是非规范化的,例如,重复字段强制执行 RI。
-
还有一点:关系和索引是两个正交但相关的主题。只能在索引字段之间定义关系,但您可以在未定义 RI 的字段上创建索引。我建议尝试使用 Tony 的实用程序来查看是否有要消除的重复索引。如果您使用 Access 默认值运行,您可能确实有重复的索引(例如,因为表设计器向 ID 字段添加索引,或者因为当您添加与您手动创建的索引重叠的关系时创建的隐藏索引)。
标签: ms-access database-design schema