查找表vs进入表

时间:2012-08-06 13:48:38

标签: sql-server tsql lookup

我有一个问题,在T-SQL设置中哪个更快,更好,面向未来?

是否更容易拥有包含ID和状态条目的查找表

ID | Status
-------------
01 | Success
02 | Failure
03 | Processing

或者,最好只输入每行的状态值吗?

这对编写查询有何影响,使用查找表而不仅仅是将状态输入行是否是良好的关系数据库设计?一个比另一个快吗?

我觉得查找表是可行的方法,但我在某些数据库中看不到这么多。

5 个答案:

答案 0 :(得分:3)

我个人会为这些项目使用单独的状态表。然后,您将在主表和单独的状态表之间使用外键。至于查询,您只需使用JOIN来包含实际的状态名称。

SELECT *
FROM yourTable t
LEFT JOIN yourStatus s
    t.sid = s.id

我认为它可以提供更大的灵活性,如果状态名称发生变化,您只需更改单独表格中的值,而不是对主表格执行UPDATE

您的表结构可能与此类似:

MainTable
id int PK,
sid int FK - to status table
col3,
col4...

Status Table
id int PK - 
name varchar(50)
IsActive bit

答案 1 :(得分:2)

没有更好的方法可以做到这一点。这取决于您的业务逻辑和您存储的数据量。

通常建议使用锁定表,因为您避免重复数据,如果您只想加载状态值(没有重复),它会更快。想象一下,您想要创建一个具有状态值的下拉列表。你只需要做一个

select * from lockup_table. 

然后,您要选择状态为处理

的行
SELECT *FROM table t
LEFT JOIN lockup_table lt ON t.sid = lt.id 
WHERE lt.status LIKE 'Processing'

它仍然很快,因为你的SGBD将使用pk索引的力量。

但有时最好有重复数据,避免连接操作。如果您认为联接操作需要一段时间,则应尝试删除锁定表,并查看您的性能是否随着更改而得到改善。您也可以为该列创建索引。它会提高性能。

总之,如果您希望状态列具有静态值(成功,处理,失败),则不需要锁定表。但是如果你想要一个具有动态值的无限范围值,那么你明天就可以添加更多的状态值等,你应该创建一个锁定表。

答案 2 :(得分:1)

我认为拥有ID并将其用作表中的外键总是更好。我认为这是最具前瞻性的解决方案。对于这种情况,特别是如果你想按状态过滤,它可以加速思考,因为它不会比较字符串。

此外,您可以将此状态表用于数据库中的其他表,并且更容易跨数据。

索引更容易。

所以在我看来,我认为这是要走的路。

干杯

答案 3 :(得分:0)

就个人而言,我使用状态表,但主键不是int而是varchar(6)。这样可以轻松运行临时报告,同时确保状态字段不是自由格式。

我的状态表通常包含以下字段:

create table foo_status (
    status      varchar(6) primary key,
    active      bit,
    name        nvarchar(255),
    description ntext null
);

,数据表通过外键引用它

create table foo (
    ...
    status varchar(6) foreign key references foo_status(status)
    ...
);
create clustered index foo_fk_status_index on foo(status);

答案 4 :(得分:0)

清单不符合使用查找表的条件

  1. 用户是否要修改此列表?
  2. 此列表是否超过10个项目?
  3. 您希望这个列表在将来扩展吗?
  4. 它是否有超过两列取决于ID / CODE / PK?

如果任何一个答案为“是”,则创建一个表并将PK用作主表中的FK。这是您唯一要做的事情!

否则,如果列表是有限的并且代表最少的状态代码,请使用枚举类型。