Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 查找表与输入表_Sql Server_Tsql_Lookup - Fatal编程技术网

Sql server 查找表与输入表

Sql server 查找表与输入表,sql-server,tsql,lookup,Sql Server,Tsql,Lookup,我有一个问题,在T-SQL设置中,它更快、更好、更适合未来 使用ID和状态条目的查找表是否更容易 ID | Status ------------- 01 | Success 02 | Failure 03 | Processing 还是只在每行中输入状态值更好 这对编写查询有何影响?使用查找表而不仅仅是在行中输入状态是一种好的关系数据库设计吗?一个比另一个快吗 我觉得查找表是一种方法,但在某些数据库中我看不到这么多。我认为在表中使用ID作为外键总是更好的。我认为这是最能证明未来的解决方案。对

我有一个问题,在T-SQL设置中,它更快、更好、更适合未来

使用ID和状态条目的查找表是否更容易

ID | Status
-------------
01 | Success
02 | Failure
03 | Processing
还是只在每行中输入状态值更好

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


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

我认为在表中使用ID作为外键总是更好的。我认为这是最能证明未来的解决方案。对于这种情况,特别是如果您想按状态筛选,它可以加快思考速度,因为它不会比较字符串

您还可以将此状态表用于数据库中的其他表,这样更容易交叉数据

而且索引更容易

所以在我看来,我认为这是一条路要走


干杯

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

SELECT *
FROM yourTable t
LEFT JOIN yourStatus s
    t.sid = s.id
我认为它允许更大的灵活性,如果您的状态名称发生更改,您只需更改单独表中的值,而不是对主表执行
更新

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

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

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

我个人使用状态表,但主键不是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);

没有比这更好的方法了。这取决于您的业务逻辑和存储的数据量

通常建议使用锁定表,因为可以避免重复数据,并且如果希望只加载状态值(无需重复),则会更快。假设您想要创建一个带有状态值的下拉列表。你只要做个决定就行了

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索引的功能

但有时最好有重复的数据,避免连接操作。如果您不知道联接操作需要一段时间,那么应该尝试删除锁定表,并查看您的性能是否因这些更改而有所提高。您也可以为该列创建索引。这将提高性能


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

使用查找表不符合条件的检查表

  • 用户是否要修改此列表
  • 这个列表是否超过10项
  • 你认为这个名单将来还会扩大吗
  • 它是否有两个以上的列依赖于ID/CODE/PK
  • 如果其中任何一个问题的答案为“是”,则创建一个表,并将PK用作主表中的FK。这是你唯一应该做的事


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

    我还要注意,在某些情况下,这些状态将永远不会用于我知道的另一个表中,并且我不确定它们的更改频率。在这种情况下,只需在表中添加一个新列。状态是否为“失败”是否会改变,它被命名为其他东西,或者它意味着其他东西?在这个例子中,我用了这个作为例子,但失败可能会导致其他东西的意义,或者可能会添加新类型的故障状态。为什么像varchar这样的主键使临时报告更容易运行?为什么状态的缩写比tinyint更好编码?我不知道这样做会有什么好处,尤其是如果后来名字改变了-现在缩写没有意义了。因为我可以说
    select。。。where status='error'
    (甚至是
    where status像'err%'
    ),而不是
    where status=123
    。但这不是一件很好的事情,通配符会降低性能。@j0N45否则,如何选择所有状态名称以
    err
    开头的行。。在我看来,你必须在某个地方使用通配符。。?