【问题标题】:Oracle SQL creating table to satisfy requirementsOracle SQL 创建表以满足需求
【发布时间】:2021-02-20 10:44:10
【问题描述】:

画廊通常会展示几件库存商品 具有相同的开始日期和相同的时期。他们实际上创建了一个画廊 以特定艺术家、媒体或其他主题为主题的展览。

我想记录一个数字展览代码作为 标识符、展览名称、展览主题(A:艺术家,M:媒体,或 O: 其他),展出的艺术品的详细信息和艺术品的总数 构成了展览。展览必须包含至少一件艺术品。

我有表格画廊和艺术品,其中包含我需要的信息,即gallery_id 和artist_code/artwork_no(一对来识别它是什么艺术品,因为艺术家可以提交多件艺术品),因此我将加入这两个表格。

这意味着从技术上讲,库存中的多件艺术品可以成为展览的一部分,我想记录下来。这意味着应该至少有一件艺术品与展览相关联,因此可以有一件或多于一件艺术品与展览相关联。

如果这令人困惑,我将 exhibtion_id 缩短为 exhibtion_id。 如果我想创建一个表,以便如果我搜索展览 ID = 1,它会显示与之关联的艺术品,我的约束应该是什么?我怎样才能实现 展览必须包含至少一件艺术品 CREATE TABLE 展览 ( 展览 ID NUMBER(7) 非空, 艺术家代码 NUMBER(4) 非空, art_no NUMBER(5) NOT NULL, 展览开始日期日期不为空, 展览结束日期日期不为空, 展览主题 CHAR(1) NOT NULL, gallery_id NUMBER(3) 非空 );

ALTER TABLE exhibit
    ADD CONSTRAINT chk_exhibit_theme CHECK ( exhibit_theme IN (
        'A',
        'M',
    'O'
    ) );

COMMENT ON COLUMN exhibit.exhibit_id IS
    'surrogate key added to replace exhibit composite PK';

COMMENT ON COLUMN exhibit.artist_code IS
    'Code/Identifier for artist';

COMMENT ON COLUMN exhibit.artwork_no IS
    'Identifier for artwork within this artist';

COMMENT ON COLUMN exhibit.exhibit_start_date IS
    'Date exhibition in the gallery began';

COMMENT ON COLUMN exhibit.exhibit_end_date IS
    'Date exhibition ends';

COMMENT ON COLUMN exhibit.exhibit_theme IS
       'Exhibition Theme
A -  Artist
M -  Media
O -  Other

';

COMMENT ON COLUMN exhibit.gallery_id IS
    'Identifier for Gallery';

ALTER TABLE exhibit ADD CONSTRAINT gallery_painting_pk PRIMARY KEY ( exhibit_id );

ALTER TABLE exhibit
    ADD CONSTRAINT exhibit_uq UNIQUE ( exhibit_start_date,
                                       exhibit_end_date,
                                       gallery_id );


ALTER TABLE exhibit
    ADD CONSTRAINT artwork_exhibit FOREIGN KEY ( artwork_no,
                                                 artist_code )
        REFERENCES artwork ( artwork_no,
                             artist_code );

ALTER TABLE exhibit
    ADD CONSTRAINT gallery_display FOREIGN KEY ( gallery_id )
        REFERENCES gallery ( gallery_id );

【问题讨论】:

  • 您是否希望 Oracle 强制执行同一件艺术品不能在重叠日期范围内出现在不同画廊中的事实? (不能同时在两个地方)
  • 我不知道这到底是什么意思,但是这个展台只是为了记录艺术品是展览的一部分,我已经有一张桌子可以展示画廊中的艺术品展示。
  • 这意味着:我目前可以创建记录说艺术品 1 从 2021 年 1 月 1 日到 2021 年 1 月 1 日在画廊 1 中,并且艺术品 1 从 2021 年 1 月 2 日到 2 月在画廊 2 中2021 年 2 月 2 日。显然这是不可能的
  • 你所说的“展览”是什么意思 - 对我来说,展览是“展览”中的单个项目,但不清楚你是否将这两个术语混为一谈,因为你的话谈论的是“展览”但是您的代码谈论“展览”。另外,对我来说,“展览”发生在“画廊”中,而“艺术品”如果是“展览”的一部分,那么它就是“展览”。这意味着“展览”指的是“画廊”(或者您的展览可以跨越多个画廊吗?)并且“展览”将“艺术品”链接到“展览”。如果展览跨越多个画廊,艺术品可以在展览期间在画廊之间移动吗?
  • 我会说,应该有三张桌子,展览、艺术品和连接这两者的一张桌子

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:

artifact_no NUMBER(5) NOT NULL 与艺术品表的外键将完成这项工作

【讨论】:

    【解决方案2】:

    我会详细说明Turo's评论:

    • 您已经有了展览桌(但如果可能的话,我会考虑将其重命名为“展览”以更清晰)
    • 您已经有了艺术品桌
    • 您应该创建一个新的exhibition_item 表,其中包含exhibition_id 列(用于标识展览)以及artifact_no 和artist_code(用于引用艺术品)
    • 为艺术品添加外键约束(如上面示例中的那些)和exhibition_id
    • 表格展览中的artifact_no和artist_code列以及对应的外键不再需要了

    现在您可以通过将记录插入到 exhibition_item 表中来将艺术品“添加”到展览中,以下语句将为您提供显示“展览馆”所需的所有信息:

    SELECT *
      FROM EXHIBIT_ITEM AS EI
        JOIN EXHIBIT AS EX ON (EI.exhibit_id=EX.exhibit_id)
        JOIN ARTWORK AS AW ON (AW.artwork_no=EI.artwork_no AND AW.artist_code=EI.artist_code)
      WHERE EX.exhibit_id=...
    

    当然您可以只选择一些特定的列,具体的 WHERE 子句将取决于您的详细要求。

    如果需要像Caius Jard 提出的“不允许一件艺术品在重叠展览中展出”的限制,可以使用数据库触发器来实现。但这是一个不同的故事......

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 2019-09-27
      • 1970-01-01
      • 2022-07-19
      • 2011-09-18
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 2018-10-26
      相关资源
      最近更新 更多