Sql server MSSQL2008:位阵列和位操作+;数据库头脑风暴

Sql server MSSQL2008:位阵列和位操作+;数据库头脑风暴,sql-server,database-design,data-modeling,bitwise-operators,Sql Server,Database Design,Data Modeling,Bitwise Operators,我有一个编码问题,我必须存储一个“便笺”和该便笺适用的日期。 想想: 附注1 嗨,今天客户先生打电话来安排这些约会。 30/8/2009、31/8/2009、5/9/2009 附注2 一切照旧。 30/8/2009 附注3 餐厅关门了。 6/9/2009 我需要将以下数据存储在数据库中,同时维护索引以实现高效检索,也就是说,我的客户端应用程序需要选择一个日期,并以独占方式或部分方式检索与该日期相关的所有注释 我已经和一些同事和朋友讨论过了,并最终讨论了这个设计。 请注意,我希望能够存储在一个表中

我有一个编码问题,我必须存储一个“便笺”和该便笺适用的日期。 想想:

附注1 嗨,今天客户先生打电话来安排这些约会。 30/8/2009、31/8/2009、5/9/2009

附注2 一切照旧。 30/8/2009

附注3 餐厅关门了。 6/9/2009

我需要将以下数据存储在数据库中,同时维护索引以实现高效检索,也就是说,我的客户端应用程序需要选择一个日期,并以独占方式或部分方式检索与该日期相关的所有注释

我已经和一些同事和朋友讨论过了,并最终讨论了这个设计。 请注意,我希望能够存储在一个表中的所有信息,或更多的设计是优雅的

> Date Bitmap | Month | Year | Note
> 101..         9       2009   Blah Blah     // applies to 1st and 3rd
> 0001...       10      2009   Blah2         // applies to the 4th
> 100           9       2009   Blah23
当用户从多日期选择器中选择以下日期时:9月1日 他会胡说八道的。单个日期时间对象将重复注释,或强制使用外键创建另一个表

在某种意义上,我可以在第一列中存储该便条适用于哪个月的哪几天。在位图中,事情可能会非常高效。任何其他方式(带有注释ID的链接表或带有所有日期ID的表)都会导致注释字段或重复日期的丑陋重复。我也不想考虑使用带有分隔符的日期集的文本字段,以及在搜索时解析它的丑陋代码

正如你所说,我在这个项目上有充裕的时间

但是客户端应用程序如何检索给定日期集的所有注释呢?MSSQL中是否有位操作?所以我可以检索所有的行,比如说,在二进制字段的第5位和第7位有一个“1”

我不能使用BETWEEN,因为我可能会有不在某个范围内的零星日期或其他类型的日期。设想有一个数据类型,它可以表示1到31之间的任何数字。我就是这样想到位图的

我还要说,我们可以添加一个额外的文本字段,其中实际日期(以实际文本形式)将由例程填充。但对于其余部分,此应用程序将是主界面,用户很少需要查看丑陋的表

我是不是过度工程化了,还是你能帮我

谢谢你的回复


狮子座是的,你的工程技术太过火了

只需创建一个datetime列,并为其编制索引。如果要拆分日期时间,请使用内置函数,如
datepart
()

“客户端应用程序如何 检索,比如说,所有的笔记 给定一组日期?”

通过在开始日期和结束日期之间使用
WHERE
子句
执行查询


将“Note”字段声明为varchar(n)[n高达8000左右]。它只使用注释占用的空间,而不是定义的最大大小。

是的,您的工程设计过度了

只需创建一个datetime列并为其编制索引。如果要拆分datetime,请使用内置函数,如
datepart
()

“客户端应用程序如何 检索,比如说,所有的笔记 给定一组日期?”

通过在开始日期和结束日期之间使用
WHERE
子句
执行查询


将“Note”字段声明为varchar(n)[n最多约8000]。它只使用注释占用的空间,而不是定义的最大大小。

如果应用程序需要选择一个日期,并检索与该日期相关的所有注释(独占或部分),则需要使用DateTime数据类型存储日期

如果注释的业务注释可以跨越天,则注释表需要
生效日期
到期日期
日期时间列。日期可以是同一天,也可以是两个分开的日期


如果您希望注释文本/正文适用于定期日(即1月1日、13日、21日),那么您需要两个表:
NOTES
NOTE\u ACTIVITY
NOTE\u ACTIVITY
将包含NOTE\u id,以及生效日期和到期日期。我只是不明白如何在数据库中以任何其他方式支持与单个文本体关联的零星日期。

如果应用程序需要选择日期,请选择d检索与该日期相关的所有注释(独占或部分),然后需要使用DateTime数据类型存储该日期

如果注释的业务注释可以跨越天,则注释表需要
生效日期
到期日期
日期时间列。日期可以是同一天,也可以是两个分开的日期


如果您希望注释文本/正文适用于定期日(即1月1日、13日、21日),那么您需要两个表:
NOTES
NOTE\u ACTIVITY
NOTE\u ACTIVITY
将包含NOTE\u id,以及生效日期和到期日期。我只是不明白如何在数据库中以任何其他方式支持与单个文本体关联的零星日期。

我个人将此拆分为两个表

NOTE
int Id
varchar NoteText

NOTEACTIVITY
int Id
DateTime ActivityDate
int NoteId
这使您的查询保持简单,并允许将来有足够的灵活性。这意味着,如果一个注释应用于三个日期,则在注释表中有一个条目,在注释活动表中有三个条目。在某些情况下,您可能会在现有设计中遇到此问题。如果客户希望将注释应用于fir每个月的第一天,你会将该行(包括便笺)复制12次吗


P>可选的,如果你已经决定了你的笔记位图思想是正确的方式,那么考虑存储日期数字而不是位图,这样你就可以存储'[ 1 ] [5 ] [ 30 ] ]。这可以使你的查询更容易运行,通过搜索包含该列中的“[5”)的行,例如

< P>我会亲自把它分割成两个表

NOTE
int Id
varchar NoteText

NOTEACTIVITY
int Id
DateTime ActivityDate
int NoteId
这使您的查询保持简单,并允许将来有足够的灵活性