查找表太多

时间:2010-07-22 17:21:55

标签: sql-server database-design enums

在数据库中包含太多查找表有什么不利影响?

我必须根据应用程序包含太多Enumerations。

专家建议什么?

4 个答案:

答案 0 :(得分:9)

最初你必须问自己“有多少是太多了?”。如果两个表之间存在逻辑关系,则必须有FK。

如果您不需要数据库中任何位置的相关表,则可以考虑删除它们并使用带有“IN”子句的CHECK约束来强制数据有效性。但是,这会导致使用枚举中的每个新值更改表格。

我个人的建议是保留FK和桌子。这是一个明确的解决方案,如果有可用于所有数字的描述文本,数据库的维护方式会更好。

答案 1 :(得分:3)

作为Florian,我更喜欢拥有大量的外键,然后选择CHECK IN(..) - 原因很简单:你可以在你的桌子上插入其他记录。

维持CHECK IN()是一个更大的问题。想象一下这种情况:

CREATE TABLE street
(
   id serial not null,
   st_type varchar(20) not null,
   st_name varchar(100) not null,
   constraint street_pk primary key (id)
   constraint street_type_check check st_type in ('STREET','AVENUE','SQUARE')
);

您有1000行检查了这些类型,对吗?如果您需要添加另一个,则需要删除约束并重新创建它。

如果您从该列表中删除某个项目(如SQUARE),那么具有该类型的已提交(并在插入时检查)的行会发生什么?他们仍然会保持无效的类型。

表和外键更易于维护和跟踪。

答案 2 :(得分:3)

让我说出查找表太少是多么可怕。我工作的一个地方的原始设计师决定将所有查找放入一个表中,并使用typeid定义查找的内容。这导致几乎所有查询都命中此表以获取导致性能受阻的查找描述性值。

此外,如果没有单独的查找,带有typeid的字段不受适合该字段的值的约束,因为外键只能在整个表上而不是块上。因此,存储clientid的字段可能会意外地包含用户组的值。这导致了数据完整性问题,并使报告变得更加困难,因为我们必须解释在上下文中没有意义的值。使用太少的表没有奖励,实际上它通常是数据库设计中的反模式。

如果您需要,则创建1000个查找表。

答案 3 :(得分:1)

查找数据的整个点是存在特定字段的有效标识符的有限列表。如果在过程或where语句中使用这些特定字段来确定正确的进程路径或限制选择列表,那么就没有太多的查找。

如果它不是特定进程或where子句的有限标识符列表,那么它们不应该是查找值。

我想到的两种类型的字段可能被认为是查找值但不一定需要。

城市和省/州:

有一个有限的列表,但因为有太多你可能不想查找这些。