Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';当我必须处理列中的值列表时,SQL中的最佳实践是什么?_Sql_Sqlite - Fatal编程技术网

什么';当我必须处理列中的值列表时,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

我是SQL新手,我想知道如何将多个值的信息编码到一个列中。更准确地说,假设我有这个表:

create table recurrent_events(
    id integer primary key autoincrement,
    weekday integer,
    action text
);
对于某些记录,
weekday
列必须包含超过1天(例如:周一、周五)

有没有一个好的方法来做这不使用一个值列表

我曾想过使用标志将日期信息存储在
weekday
列中:

  • 2^0
    :星期一
  • 2^1
    :星期二
  • 2^6
    :周日
将与天数相对应的2的幂相加,并使用按位
提取位


这是一个好的选择吗?我应该知道还有其他方法或更好的技术吗?

因为您的表不会无限增长,直观地理解列的内容比节省一些内存/硬盘空间或毫秒来查询结果更重要:

我会在每个工作日创建一个位/布尔列: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),但在可维护性方面会花费您一点