首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库设计(Oracle) -业务逻辑建模

数据库设计(Oracle) -业务逻辑建模
EN

Stack Overflow用户
提问于 2016-06-02 20:22:46
回答 1查看 38关注 0票数 0

我面对的是下面的湿疹。

考虑下面的代码--这是我用来描述问题的东西--不是一个真正的实现,我省略了一些检查约束和NOT NULL,以避免给画面蒙上阴影。

代码语言:javascript
复制
CREATE TABLE Theater_Halls(
    thha_id NUMBER(2) CONSTRAINT pk_thha_id PRIMARY KEY,
    thha_name VARCHAR2(30) CONSTRAINT nn_thha_name NOT NULL,
    thha_no_of_seats NUMBER(4) CONSTRAINT ch_thha_no_of_seats CHECK (thha_no_of_seats > 0)
        CONSTRAINT nn_thh_no_of_seats NOT NULL
);     
CREATE TABLE Seats (
    seat_id NUMBER (8) CONSTRAINT pp_seat_id PRIMARY KEY,
    seat_no NUMBER (4) CONSTRAINT ch_seat_no CHECK (seat_no > 0),
    thha_id NUMBER(2) CONSTRAINT fk_seat_thha_id REFERENCES Theater_Halls(thha_id)
);


CREATE TABLE Events ( -- each event has a hall in theater associated with it
    evnt_id NUMBER(4) CONSTRAINT pk_evnt_id PRIMARY KEY,
    evnt_name VARCHAR2(30) CONSTRAINT nn_evnt_name NOT NULL,
    thha_id NUMBER(2) CONSTRAINT fk_evnt_thha_id REFERENCES Theater_Halls(thha_id),
    evnt_date TIMESTAMP CONSTRAINT nn_evnt_time NOT NULL
);

CREATE Table Users (
    user_id NUMBER(10) CONSTRAINT pk_user_id PRIMARY KEY
    );

CREATE TABLE Bookings (
    bkng_id NUMBER(10) CONSTRAINT pk_bkng_id PRIMARY KEY,
    evnt_id NUMBER(10) CONSTRAINT fk_bkng_evnt_id REFERENCES Events(evnt_id),
    seat_id NUMBER(8) CONSTRAINT fk_bkng_seat_id REFERENCES Seats(seat_id),
    user_id NUMBER(10) CONSTRAINT fk_bkng_user_id REFERENCES Users(user_id),
    bkng_price NUMBER(6,2) CONSTRAINT nn_bkng_price NOT NULL,
    CONSTRAINT un_evnt_seat_user UNIQUE (evnt_id, seat_id)
);

现在,从某种意义上说,这个实现是令人满意的标准,它保存数据时没有(看起来)异常。

不过,我有两个问题。

  1. 如果保留在上面的表单中,最初使用user_id作为NULL创建,一旦在应用程序中预订,user_id将被填充,并且过程将跟踪预定的座位(user_id <> NULL)。
  2. 或者这是否是创建中间表的更好方法? 创建表Events_Seats ( evse_id数(8)约束pk_evse_id主键,evnt_id数(4)约束fk_evse_evnt_id引用事件(Evnt_id),seat_id数(8)约束fk_seat_id引用座位(Seat_id),evse_price数(6,2)约束nn_evse_price不为空,约束un_evnt_seat_user唯一(evnt_id,seat_id)); 然后有一个外键链接到预订,其中订位表将是‘事务性’-意味着,新的行将插入时,一个sit为一个给定的事件。在对业务逻辑和潜在错误/无效数据建模方面,给定的方法有什么好处吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-03 03:18:39

我想您不需要EVENT_SEATS表。您甚至不需要使用NULL for userid填充NULL。只需将Bookings表保留为空。您可以使用以下方法查询可能预订的事件:

代码语言:javascript
复制
select e.EVNT_NAME as EventName, s.seat_no as AvailableSeat
from  events e
join seats s
on s.thha_id = e.thha_id
left join Bookings b
on b.seat_id = s.seat_id and
   b.evnt_id = e.thha_id
where  e.evnt_id = 1 and
   b.bkng_id is null

当创建预订记录时,b.bkng_id is null将从可能的预订列表中删除结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37601434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档