什么';当我必须处理列中的值列表时,SQL中的最佳实践是什么?
我是SQL新手,我想知道如何将多个值的信息编码到一个列中。更准确地说,假设我有这个表:什么';当我必须处理列中的值列表时,SQL中的最佳实践是什么?,sql,sqlite,Sql,Sqlite,我是SQL新手,我想知道如何将多个值的信息编码到一个列中。更准确地说,假设我有这个表: create table recurrent_events( id integer primary key autoincrement, weekday integer, action text ); 对于某些记录,weekday列必须包含超过1天(例如:周一、周五) 有没有一个好的方法来做这不使用一个值列表 我曾想过使用标志将日期信息存储在weekday列中: 2^0:星期一 2
create table recurrent_events(
id integer primary key autoincrement,
weekday integer,
action text
);
对于某些记录,weekday
列必须包含超过1天(例如:周一、周五)
有没有一个好的方法来做这不使用一个值列表
我曾想过使用标志将日期信息存储在weekday
列中:
:星期一2^0
:星期二2^1
:周日2^6
和
提取位
这是一个好的选择吗?我应该知道还有其他方法或更好的技术吗?因为您的表不会无限增长,直观地理解列的内容比节省一些内存/硬盘空间或毫秒来查询结果更重要: 我会在每个工作日创建一个位/布尔列:motuwe。。。苏 这比将表连接到“tbl_weekdays”要好,因为您必须确保没有人将同一个工作日分配给同一事件两次 从技术角度来看,您提到的位编码解决方案非常优雅,但需要关于位含义的隐含知识。单独的列可以使这些知识明确化,并简化SQL查询
顺便说一句:此解决方案之所以有效,是因为不同值的基数较低(仅为7),否则列数将激增。因为您的表不会无限增长,直观地了解列的内容比节省一些内存/硬盘空间或毫秒来查询结果更重要: 我会在每个工作日创建一个位/布尔列:motuwe。。。苏 这比将表连接到“tbl_weekdays”要好,因为您必须确保没有人将同一个工作日分配给同一事件两次 从技术角度来看,您提到的位编码解决方案非常优雅,但需要关于位含义的隐含知识。单独的列可以使这些知识明确化,并简化SQL查询
顺便说一句:这个解决方案之所以有效,是因为不同值的基数很低(只有7个),否则列的数量会激增。您的表结构建议使用MySQL(“自动增量”) MySQL有一个名为set的构造,这可能就是您正在寻找的内容(文档是这样的)。集合本身的元素的行为类似于
enum
s,并使用位进行存储
一般来说,我对使用集合和枚举有很大的保留:
- 它们是特定于数据库的,因此代码对其他系统的可移植性较差
- 对电视机的尺寸有严格的限制
- 它们支持难以读取和维护的神秘编码(
)WHERE set\u col&1
- 看似相似的集合的定义可能因表而异
存储此类信息的“普通”SQL方法是连接表。在您的情况下,对于每个操作和工作日,这将是一行。根据信息的使用方式,一组布尔列,甚至一周中几天的字符串表示也可能是合适的。您的表结构建议使用MySQL(“自动增量”) MySQL有一个名为set的构造,这可能就是您正在寻找的内容(文档是这样的)。集合本身的元素的行为类似于
enum
s,并使用位进行存储
一般来说,我对使用集合和枚举有很大的保留:
- 它们是特定于数据库的,因此代码对其他系统的可移植性较差
- 对电视机的尺寸有严格的限制
- 它们支持难以读取和维护的神秘编码(
)WHERE set\u col&1
- 看似相似的集合的定义可能因表而异
存储此类信息的“普通”SQL方法是连接表。在您的情况下,对于每个操作和工作日,这将是一行。根据信息的使用方式,一组布尔列,甚至是一周中几天的字符串表示也可能是合适的。位图技术的可能复制是一个技巧,可以节省一些速度和空间(+1)但是在可维护性方面会花费您一点,因为位图结构需要外部解释(也许命名字段
weekday\u bitmap
会更容易)。我处理它的方法是另一个单独的表,它将存储(id integer,weekday integer)
数据,并且每个id
可能有多个weekday
条目。首先,用您正在使用的数据库标记您的问题。其次,解释如何使用这些数据。最好的数据表示通常取决于数据的使用方式以及它表示的内容。“我可以将许多值的信息编码到一个列中”不要这样做-尤其是如果您是关系数据库(和SQL)的新手它违反了所有规范化规则,只有在十亿行表上的查询没有按需要执行时,才应将其视为最后手段。@GordonLinoff我刚刚用数据库标记了这个问题。我想使用此表存储重复事件。每个行动(例如:周一和周五的锻炼)将插入另一个包含所有事件(经常性和孤立性)的表中,并带有正确的日期((1,“锻炼”,“2015-11-09”),(2,“锻炼”,“2015-11-13”))。我们的目标是生成一周的时间表。位图技术的可能重复是一个技巧,它将为您节省一些速度和空间(+1),但在可维护性方面会花费您一点