資料庫關係為多型關聯時,適當使用反模式

2021-06-21 16:11:53 字數 1413 閱讀 6360

多型關聯:

當乙個表中的某列可能要引用多個表,這時候需要增加額外的一列來確定引用來之那個表,一般為entity_type列。

可以使用反sql模式中的幾種方式來避免這個多餘的列,但是會帶來額外的開銷。

解決方法一:

,但是交叉表一般是多對多關係才出現的,在這裡一條品論一般只能對應一條bugs或者是一條requires,這是我們應該在交叉表中為comment_id列建立唯一索引

解決方案二:

使用超級父表,下面是簡單的**:

/**多型關聯資料庫例項反模式,使用超級表*/

/*超級表*/

create table issuse (

issuse_id int unsigned not null primary key

);/*可以看成這兩個表繼承了issuse表*/

create table bugs(

issuse_id int unsigned not null primary key,

bugs_name varchar(20),/*這裡省略跟多列*/

foreign key(issuse_id) references issuse(issuse_id)

);create table requires(

issuse_id int unsigned not null primary key,

require_name varchar(20),/*省略多列*/

foreign key(issuse_id) references issuse(issuse_id)

);create table tcomments(

comment_id int unsigned not null primary key,

comment_con varchar(20), /*省略多列*/

foreign key(issuse_id) references issuse(issuse_id)

);select * from bugs b

inner join tcomments tc on tc.issuse_id = b.issuse_id

where b.issuse_id = 1;

/**這裡可以設定乙個變數來終止查詢,如果在bugs中查詢到了記錄那麼就不在查詢requires了*/

select * from tcomments tc

left join bugs b on b.issuse_id = tc.issuse_id

left join requires rs on rs.issuse_id = tc.issuse_id

where tc.comment_id = 1;

/*通過程式來判斷哪些字段是否設定了,或者是做其他的優化*/

借鑑之sql反模式一書

規則 適當使用資料庫

內容 當需要acid屬性來儲存資料之間的關係和一致性時,可以使用關係型資料庫。其他資料的儲存需要考慮更適合的工具,如nosql dbms。場景 當在系統結架構中引入新資料或資料結構時。用法 考慮資料量 儲存量 響應時間長短 關係和其他因素來選擇適當的儲存工具。也要考慮資料結構及產品需要對資料進行的管...

hibernte關聯關係時刪除資料庫的資料

例如 user scart 在這之中user與list有關聯關係,並且通過user來刪除list中的物件。我們用list scarts user.getscart 來獲取到scarts集合。然後用 scarts.remove 方法來刪除,remove我們可以通過兩種方式來刪除一是 通過物件scart...

關係型資料庫關聯更新資料彙總

先給出需求,有2張表,學生表和分數表,兩種表都有乙個分數列,但是這兩列的值不一致,現在需要更新學生表,讓學生表中的值等於分數表中的值。初始化指令碼如下 create table student id varchar 100 primary key,name varchar 50 addr varch...