回答

收藏

营业时间数据库设计

技术问答 技术问答 234 人阅读 | 0 人回复 | 2023-09-14

我们目前正在开发一个应用程序,其中多个实体具有关联的营业时间。营业时间可能会持续数天,也可能会在一天内。) S: R. r6 ?7 ?3 i* x7 ?
前任。星期一在6:00开放,星期五在18:00关闭。
' C& C6 b( E. R( s" A或者2 h+ k5 I( @+ `+ P$ b
星期一在06:00开放,星期一在15:00关闭。
1 l( d% t# g9 F- V同样,一个实体每天可能有多组开放时间。到目前为止,我发现最好的设计是定义一个开放时间,其中包括以下内容:
% `/ T! M* {; F; RStartDay,StartTime,EndDay和EndTime。+ r) L  Q1 L, s
这种设计提供了所有所需的灵活性。但是,数据完整性成为一个问题。我似乎找不到解决方案来禁止跨度重叠(在数据库中)。
5 [5 T0 M! q4 A1 o2 f请分享您的想法。; P5 B: S7 [4 G% w7 C
编辑:数据库是Microsoft SQL Server 2008 R2
0 l; i  @. c# S8 E9 l               
$ M9 j& Z# n/ v6 y解决方案:& B6 V0 S  C1 `- n( t2 w
               
9 d/ v8 [! O! q1 ]& Z' A: r9 m1 r
. s& Q8 Q% t; f* O' y4 t6 I$ Z. l( {) e; B) R1 c) ~4 Q
                假设一个健壮的触发框架9 ]5 ~5 b  g, K8 _0 u
在插入/更新时,您将检查新的开始或结束日期是否在任何现有范围内。如果是这样,那么您将回滚更改。
) N" T2 q) f& c6 V$ _0 D" GCREATE TRIGGER [dbo].[mytable_iutrig] on [mytable] FOR INSERT, UPDATE AS
. Y+ S8 w$ |" D0 PIF (SELECT COUNT(*)
7 x; P  [* U. B0 }/ T2 g2 fFROM inserted, mytable  ?8 h7 G9 [2 A  e3 D; x
WHERE (inserted.startdate  mytable.startdate)
1 r. p5 z- u( o  Y, }: {5 c& t% c      OR (inserted.enddate  mytable.startdate)) > 0 9 t2 K/ N) r3 Z+ n3 \' i. B
BEGIN+ u( B1 {9 ~+ y  S/ X; p/ E: y7 n
    RAISERROR --error number: u- s; s8 p$ N0 `+ \8 o
    ROLLBACK TRANSACTION
' Y, b4 g2 a, |* m. LEND
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则