SQL 2008:位数组和按位运算+数据库头脑风暴

时间:2009-09-21 05:11:45

标签: sql-server database-design data-modeling bitwise-operators

我遇到编码问题,我必须存储“注释”以及注释适用的日期。 想一想:

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

注2 照常营业。 30/8/2009

注3 餐厅关闭。 2009年6月9日

我需要将以下数据存储在数据库中,同时维护索引以便有效检索,也就是说,我的客户端应用程序需要选择一个日期,并且只检索与该日期相关的所有注释,无论是部分还是部分。

我与一些同事和朋友讨论过,并且已经接受了这种设计。 请注意,如果设计优雅,我希望能够将所有信息存储在一个表中,或者更多。

> 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日 他会得到Blah Blah和Blah23。单个日期时间对象将重复该注释,或强制使用外键创建另一个表。

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

你可以说,我在这个项目上有很多时间。

但客户端应用程序 RETRIEVE 如何说出给定日期的所有注释? MSSQL中有任何位操作吗?所以我可以检索所有行,例如,在该二进制字段的第5和第7位 a'1'

我不能使用BETWEEN,因为我可能有零星的日期,不在范围内或任何类型或类别。想想有一个数据类型,它可以表示从1到31的任何数字。这就是我对位图的看法。

我还要说,我们可以添加一个额外的文本字段,其中实际日期(实际文本)将由例程填充。但对于其他人来说,这个应用程序将是主界面,很少用户必须查看丑陋的表格。

我是否过度工程,或者你可以帮我吗?

感谢您的所有回复。

利奥

3 个答案:

答案 0 :(得分:2)

是的,你过度工程了。

只需创建一个日期时间列,然后将其编入索引即可。如果要分割日期时间,请使用内置函数,如datepart()。

  

“客户端应用程序如何?   RETRIEVE说,所有的笔记   给定日期?“

通过WHERE子句BETWEEN执行查询开始日期和结束日期。

将'Note'字段声明为varchar(n)[n最多约8000)。它仅使用音符占用的空间而不是最大定义的大小。

答案 1 :(得分:1)

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

如果备注的业务备注可以跨越几天,那么您的NOTES表需要EFFECTIVE_DATEEXPIRY_DATE DateTime列。日期可以是同一天,也可以是几天。

如果您希望注释文本/正文适用于定期日期(IE 1月1日,13日,21日),那么您需要两个表:NOTESNOTE_ACTIVITYNOTE_ACTIVITY将包含note_id,以及有效和到期日期。我只是没有看到你如何支持在数据库中以任何其他方式支持与单个文本体相关的零星日期。

答案 2 :(得分:1)

我个人将此分为两个表

NOTE
int Id
varchar NoteText

NOTEACTIVITY
int Id
DateTime ActivityDate
int NoteId

这可以简化您的查询,并在将来提供充分的灵活性。这意味着如果注释适用于三个日期,则Note表中有一个条目,NoteActivity表中有三个条目。在某些方面,您可能会遇到现有设计的这个问题。如果客户想要在每个月的第一天申请一个注释,那么你会将该行(包括注释)重复12次吗?

或者,如果您已经确定笔记位图的想法是正确的,那么考虑存储日期数而不是位图,这样您就可以存储“[1] [5] [30]”。通过搜索该列中包含“[5]”的行(例如

),这可以使您的查询更容易运行