将未知大小的数据存储到表中

时间:2013-08-07 13:26:50

标签: c# sql-server

我知道有关于此的辩论,尽管我可以找到一个真正明确的答案。

很多时候,这个问题导致定义varchar(MAX)等,它们的实际限制以及不使用的内容。

我想知道的是:
我正在为用户提供一个选项,可以无限制地在文本框中键入/粘贴任何他们想要的内容 这可以是从单词到图像的字节数组转储。

然后,我需要能够在稍后阶段使用其TITLE或ID快速引用此数据。

将这些数据存储到数据库中的最佳方法是什么?我已经读过使用varchar(MAX)停止索引,通常不应该使用。

我在SQL中并不是很富裕,所以我想可能的解决办法是将这个字符串拆分成4000个数组,然后将它们存储起来。

这是一个很好的领导?或者我错过了一些明显的东西?

一般模型:

    public string a_Title { get; set; }

    public string a_Content { get; set; }

    public string a_AdditionalInfo { get; set; }

其中a_Content将存储为未知。

4 个答案:

答案 0 :(得分:2)

我相信您现在不必担心您的存储类型。你真的可以选择varchar(n),varchar(max),nvarchar(n),nvarchar(max),甚至varbinary和text / ntext。所有这些都有其优点和缺点。您甚至可以使用FILESTREAM将类似blob的字符串放入文件中。

但是,我相信您希望通过某个int或short varchar字段引用您的数据,并且您希望得到相对较快的结果(而不是炽热的热门数据 - 昨天 - 快速)。可以有或多或少的最佳方式,但现在不考虑这一点。

我建议:

  • 创建满足您需求的表格结构
  • 用一些虚拟数据填充
  • 使用您喜欢的数据访问层实现数据访问

当你感到足够快乐的时候,创建一个性能测试机会,比如几千次访问。这是您第一次想要优化性能。在那之前,我甚至会忘记索引本身。

P.S。 - 不要将其拆分为4000字节的块;这是一个非常尴尬的解决方法,它可能导致随机搜索未命中(不完全随机,您可以在缓慢而痛苦的调试会话后找到错误)

答案 1 :(得分:1)

VarChar(MAX)适用于像您这样的案件。

即使您将数据块化为NVarChar(4000)(或VarChar(8000))字节段以允许构建索引,这些索引的确有什么价值呢?

你也要打开自己的头脑,找出段开始和结束的位置,然后在讨厌的SQL语句或某些中间层客户端代码中重构它们。

此外,VarChar(MAX)NVarChar(MAX)会在可能的情况下保持在行内。这意味着在您分别使用40018001字符之前。

答案 2 :(得分:0)

一种方法是构建两个表,并利用VARCHAR(MAX)

CREATE TABLE table1 (ID INT PRIMARY KEY IDENTITY(1, 1), Name VARCHAR(1024) NOT NULL);
CREATE TABLE table1Text (ID INT PRIMARY KEY, data VARCHAR(MAX) NOT NULL);

ID中的table1Texttable1的外键引用。这种方法的好处是您仍然可以索引table1 ,您可以在table1Text上提供全文搜索,而不会遇到任何相互影响的问题。< / p>

答案 3 :(得分:0)

我很想使用varbinary(max)来表示你所描述的这个“catch-all”数据列。 varbinary数据类型可以存储文本(见下文),字节数组和整个文件。大小限制是2GB,但varbinary(与弃用的图像相反)的好处是你可以使用简单的子字符串函数返回/下载一部分数据。所以,如果你只想要一些数据的前100mb,你就用了:

Declare @data as varbinary(100000000)
select @data = substring(DataColumn,0,100000000) from SomeDataTable where ID = 1

要将文本插入varbinary,您可以使用:

declare @test table (
   data varbinary(max) not null,
   datatype varchar(10) not null
)

--insert varchar
insert into @test (data, datatype) 
values cast('Your Text Here' as varbinary(max)), 'varchar'

-- insert nvarchar
insert into @test (data, datatype) select cast(N'YourTextHere' as varbinary(max)), 'nvarchar'

-- see the results
select data, datatype from @test
select cast(data as varchar(max)) as data_to_varchar, datatype from @test
select cast(data as nvarchar(max)) as data_to_nvarchar, datatype from @test