Sql 一列键还是多列键?

Sql 一列键还是多列键?,sql,database-schema,rdbms,Sql,Database Schema,Rdbms,假设我在一个RDBMS中有两个表,它们试图根据不同的键规范对相同数据的存储和检索进行建模。表1将整个键存储在单个char列中,表2将键存储在多个列中,如下所示: 表1:键=字符串,值=数据 表2:col1=String,col2=String,value=Data 表1键包含与col1和col2组合相同的信息,以及可能的分隔符,例如key=“NASDAQ/SUNW”,col1=“NASDAQ”,col2=“SUNW” 我对高效的数据检索感兴趣。使用表1会比使用表2更有效吗?如果您的键包含多个值,

假设我在一个RDBMS中有两个表,它们试图根据不同的键规范对相同数据的存储和检索进行建模。表1将整个键存储在单个char列中,表2将键存储在多个列中,如下所示:

表1:键=字符串,值=数据

表2:col1=String,col2=String,value=Data

表1键包含与col1和col2组合相同的信息,以及可能的分隔符,例如key=“NASDAQ/SUNW”,col1=“NASDAQ”,col2=“SUNW”


我对高效的数据检索感兴趣。使用表1会比使用表2更有效吗?

如果您的键包含多个值,您应该将它们分隔成单独的列。这样,如果需要,您就可以对它们单独进行索引,例如,如果您需要能够按第二个值过滤resultset(在您的示例中,假设您需要使用SUNW查找所有记录)


根据经验,如果将逗号分隔的值放入单个数据库列中,很可能是做错了。

如果键包含多个值,则应将它们分隔为单独的列。这样,如果需要,您就可以对它们单独进行索引,例如,如果您需要能够按第二个值过滤resultset(在您的示例中,假设您需要使用SUNW查找所有记录)


根据经验,如果将逗号分隔的值放在单个数据库列中,很可能是做错了。

使用正则表达式(例如“*SUNW.*”)进行查询的成本要高得多?是的。如果SUNW位于单独的列中,则可以为该列编制索引,并执行B树搜索(fast)以查找具有该值的所有行。但是,如果它与其他内容一起隐藏在列中,则必须进行表扫描(慢速)才能找到它们。使用正则表达式(例如“*SUNW.*”)进行查询将花费更高的成本?是的。如果SUNW位于单独的列中,则可以为该列编制索引,并执行B树搜索(fast)以查找具有该值的所有行。但是如果它和其他东西一起埋在一列中,你必须做一个表扫描(慢)来找到它们。