我有许多表的文本列只包含几个不同的不同值。我经常在将可能的值提取到查找表中的好处(主要是减小的行大小)之间进行权衡,并在表中存储一个小索引,以反映执行此操作所需的工作量。
对于具有预先知道的固定值集的列(枚举值),这并不是那么糟糕,但更痛苦的情况是当我知道我有一小组独特的值时,但我不知道事先知道它们会是什么。
例如,如果我有一个表来存储Web应用程序中不同URL的日志信息:
CREATE TABLE [LogData]
(
ResourcePath varchar(1024) NOT NULL,
EventTime datetime NOT NULL,
ExtraData varchar(MAX) NOT NULL
)
我通过重复每个请求浪费了大量空间。此表中将有大量重复条目。我通常最终得到这样的东西:
CREATE TABLE [LogData]
(
ResourcePathId smallint NOT NULL,
EventTime datetime NOT NULL,
ExtraData varchar(MAX) NOT NULL
)
CREATE TABLE [ResourcePaths]
(
ResourcePathId smallint NOT NULL,
ResourceName varchar(1024) NOT NULL
)
然而,在这种情况下,我不再有一种简单的方法将数据附加到LogData表。我必须在资源路径表上查找以获取Id,如果缺少则添加它,然后才能执行实际插入。这使得代码变得更加复杂,并且改变了我的只写日志记录功能,需要对查找表进行某种交易。
我错过了一些明显的东西吗?
答案 0 :(得分:0)
如果ResourseName上有唯一索引,即使在大桌面上查找也应该非常快。但是,它有缺点。例如,如果您记录大量数据并且必须定期将其归档并希望归档上一个月或一年的logdata,则您将被迫保留所有的resoursepath。你可以为所有这些提出解决方案。
答案 1 :(得分:0)
是从现有数据插入作为插入
的一部分进行查找将@resource,@ time和@data作为输入
insert( ResourcePathId, EventTime, ExtraData)
select ResourcePathId, @time, @data
from ResourcePaths
where ResourceName = @resource