0

我有一个编码问题,我必须存储“注释”和注释适用的日期。考虑到:

注 1 您好,今天客户先生打电话安排这些约会。2009 年 8 月 30 日、2009 年 8 月 31 日、2009 年 5 月 9 日

注 2 照常营业。2009 年 8 月 30 日

注 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 位中有一个“1”

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

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

我是否过度设计,或者你能帮助我吗?

感谢你的回复。

狮子座

4

3 回答 3

2

是的,你过度设计了。

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

“客户端应用程序如何检索给定日期集的所有注释?”

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

将 'Note' 字段声明为 varchar(n) [n 最多 8000 左右)。它只使用笔记占用的空间,而不是最大定义的大小。

于 2009-09-21T05:13:35.173 回答
1

我会亲自把它分成两张桌子

NOTE
int Id
varchar NoteText

NOTEACTIVITY
int Id
DateTime ActivityDate
int NoteId

这使您的查询变得简单,并为将来提供了足够的灵活性。这将意味着,如果一个注释适用于三个日期,您在 Note 表中有一个条目,在 NoteActivity 表中有三个条目。在某些方面,您可能会在现有设计中遇到这个问题。如果客户希望将注释应用于每个月的第一天,您将复制该行(包括注释)12 次?

或者,如果您已经确定您的笔记位图想法是正确的方法,那么请考虑存储日期数字而不是位图,这样您就可以存储“[1][5][30]”。例如,通过在该列中搜索包含“[5]”的行,这可能会使您的查询更容易运行

于 2009-09-21T07:14:05.270 回答
1

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

如果注释的业务注释可以跨越数天,则您的 NOTES 表需要EFFECTIVE_DATEEXPIRY_DATEDateTime 列。日期可能是同一天,也可能是隔天。

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

于 2009-09-21T05:18:02.747 回答