Oracle SQL中能否通过表行引用实现歌曲与艺术家关联?结构咨询
当前数据库结构的可行性分析
一、现有结构完全能满足需求
你现在用普通表(SONG、ARTIST)搭配带REF字段的关联表(ARTIST_SONG_CONNECTION)的设计,完全可以实现「通过艺术家ID插入新歌曲并建立关联」的需求,没必要强制改成对象表。具体来说:
- 编写存储过程时,可先往SONG表插入新歌曲记录,再通过艺术家ID找到ARTIST表对应行的REF值,最后将REF和新歌曲ID插入关联表完成绑定。
- 这种设计保留了关系型表的直观性,小型数据库下维护、查询都更简单——比如查某艺术家的歌曲时,直接通过关联表关联两张普通表即可,不需要处理对象表的特殊语法。
二、对象表的适用场景
如果创建CREATE TABLE SONGS_REF OF song_t这类对象表,更多是为了利用面向对象特性:
- 比如需要实现继承、多态,或是要把歌曲作为完整的对象实体管理(后续扩展对象方法)。
- 但对你的小型数据库需求来说,对象表反而会增加复杂度:查询时要用到
VALUE()函数获取属性,关联语法比普通关联表繁琐,日常维护(索引、约束)也不如普通表灵活。
三、基于现有结构的存储过程示例
以下是一个简单的存储过程框架,你可根据实际字段调整:
CREATE OR REPLACE PROCEDURE insert_song_for_artist( p_artist_id IN ARTIST.artist_id%TYPE, p_song_name IN SONG.song_name%TYPE, p_duration IN SONG.duration%TYPE ) AS v_artist_ref REF artist_t; v_new_song_id SONG.song_id%TYPE; BEGIN -- 1. 插入新歌曲到SONG表 INSERT INTO SONG(song_name, duration) VALUES(p_song_name, p_duration) RETURNING song_id INTO v_new_song_id; -- 2. 获取对应艺术家的REF值 SELECT REF(a) INTO v_artist_ref FROM ARTIST a WHERE a.artist_id = p_artist_id; -- 3. 插入关联记录 INSERT INTO ARTIST_SONG_CONNECTION(artist_ref, song_id) VALUES(v_artist_ref, v_new_song_id); COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20001, '指定的艺术家ID不存在'); WHEN OTHERS THEN ROLLBACK; RAISE; END; /
内容的提问来源于stack exchange,提问作者Kefest1
相关产品推荐
相关产品推荐

