Sql 长文本或数千行,或者其他什么?

Sql 长文本或数千行,或者其他什么?,sql,database-design,Sql,Database Design,我正在设计一个程序,在这个程序中,用户可以对数千人(或者可能是数百万人)进行单一选择。我想到了两种将其存储在数据库中的方法: 1) 每个条目都有一个单独的行 2) 一个单独的长文本,它只是为一个新人添加一个选项或修改一个现有人的选项 我想每个条目单独的行应该更有效,但是如果我们说的是成百上千的条目,那么与只返回一个长文本并使用用户的cpu解析文本相比,我所看到的查询的网络开销是多少 例如,单个长文本可能类似于: Data [Person A:Choice A][Person B: Choice

我正在设计一个程序,在这个程序中,用户可以对数千人(或者可能是数百万人)进行单一选择。我想到了两种将其存储在数据库中的方法: 1) 每个条目都有一个单独的行 2) 一个单独的长文本,它只是为一个新人添加一个选项或修改一个现有人的选项

我想每个条目单独的行应该更有效,但是如果我们说的是成百上千的条目,那么与只返回一个长文本并使用用户的cpu解析文本相比,我所看到的查询的网络开销是多少

例如,单个长文本可能类似于:

Data
[Person A:Choice A][Person B: Choice A][Person C: Choice C]...[Person n:Choice n]
而多行显然是:

Person    Choice
A         A
B         A
C         C
....
n         n
也许我一开始并没有用正确的方式思考这个问题。有没有更有效的方法来做这样的事情


谢谢你的意见。

我将把我的评论放在回答中,并在适当的地方展开

关于您对
string
Table
的决定。每次都是一张桌子

基于表
Person(Id,Name)
、表
Choice(Id,Value)
和表
PersonChoice(Id,PersonId,ChoiceId)
的设计。将为您提供一个可索引、可搜索和灵活的解决方案

在SQL中的文本列中隐藏数据是一个非常糟糕的主意-显然忽略
XML
数据及其数据类型。但这不适用于这里

在以后添加统计信息的一个解决方案是,安排SQL代理作业运行数据,解析所做的更改以及更改的时间,并将数据存储在单独的“报告”表中

<>在你的设计中要考虑的一些事情——保存你自己必须存储和操纵100000行——是将选择分组在一起的想法。可以为您节省大量工作(为您自己和服务器)

欢迎来到数据库设计的世界

我认为每个条目单独的行应该更有效,但是 如果我们说的是成千上万的参赛作品, 那么,我要查询的网络开销是多少 而不是仅仅返回一个长文本并使用用户的cpu 解析文本

网络开销(作为两种设计之间的差异)可以忽略不计。基本上,您发送到服务器的所有内容都是查询,服务器返回的所有内容都是结果集。如果查询结果为一行,则服务器仅返回一行。如果查询结果为10000行,服务器将发回10000行

真正的开销在于服务器上的执行速度和维护。如果使用索引,服务器将在表中快速找到索引行。但在“1、2、3、5、6、7、8、10、13、17、18、30、27”这样的单个值中查找17可能不会使用索引


这样的值也会丢失类型安全性以及使用外键引用和级联的能力。

每次都会丢失表。表
Person
、表
Choice
、表
PersonChoice
,其中包含显示所做选择的各个表的ID。可索引、可搜索、灵活。我想我还应该补充一点,用户将能够查看他/她对每个人所做选择的总体统计数据,因此我必须以任何方式访问用户的所有选择。在这种情况下,您还会推荐表吗?毫无疑问,在SQL中将数据隐藏在文本列中是一个非常糟糕的主意。要保存1000行,可以调查选项组,以减少行数?很快就会有人提出这个论点,比我要简洁得多!我想肯定有比你说的更多的东西。用户对数百万人进行选择是不可行的,除非他们以某种方式分组。在这种情况下,您可以进一步分解结构
Person-->Group-->Choice1 | Choice2 etc
。否则我会建议使用桌子,它更灵活。如果您真的担心性能,您可以设置一个夜间作业,将主表格式化为长字符串,但这只有在数据变化不大的情况下才有效。谢谢--我有意不提供所有细节,但提供的信息对我来说已经足够了,根据你所说的,我建议你把这个Id从PersonChoice表中去掉,因为这个表的PK是PersonId,ChoiceId,并且每个Id都作为FK放到各自的表中。就像我说的一个小建议