【发布时间】:2010-11-29 23:49:56
【问题描述】:
我有一个编码问题,我必须存储“注释”和注释适用的日期。 想想:
注 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 的所有日期的表)都导致注释字段或重复日期的丑陋重复。我也不想考虑让 Text 字段包含带有分隔符的日期集,以及在搜索时解析它的丑陋代码。
如您所知,我在这个项目上花了不少时间。
但是客户端应用程序 RETRIEVE 怎么能说出给定日期集的所有注释呢? MSSQL中是否有任何位操作?所以我可以检索所有的行,比如说,二进制字段的第 5 位和第 7 位中的“1”?
我不能使用 BETWEEN,因为我可能有零星的日期,这些日期不在一个范围或任何东西或那种范围内。想想有一个数据类型,它可以表示从 1 到 31 的任何数字。这就是我对位图的看法。
我还要说,我们可以添加一个额外的文本字段,其中实际日期(以实际文本形式)将由例程填充。但对于其余部分,此应用程序将是主界面,用户很少需要查看丑陋的表格。
我是不是过度设计了,还是你能帮帮我?
感谢您的所有回复。
狮子座
【问题讨论】:
-
大家好,非常感谢您的回复,但我还是有点困惑。这个愚蠢的“注意”可以适用于一天或几天。它们可以是范围或传播,没关系。我正在寻找一种不会重复的方法。如果我有一个 dateTime 列,它将占用两个表。我的客户很疯狂,想把所有东西都放在一张桌子上。这就是为什么我想到了位图,而不是有一个列出日期的文本字段。
-
客户并不总是正确的。问他们为什么他们想要一张桌子上的所有东西......
-
如果您的客户联系人熟悉数据建模,那么当您提出业务逻辑不支持他们给您的单表要求的问题时,他们应该会很清楚。
-
好吧,我也想挑战一下自己。但我想那是一个非常困难的问题。
-
@Leo:希望与 DBA 一起审查数据模型的人 =)
标签: sql-server database-design data-modeling bitwise-operators