關於資料庫多對多結構的設計和SQL語句的複雜問題

2021-03-12 14:56:35 字數 2668 閱讀 3268

1樓:

你這個的前提是 水果個數基本固定 不超過10個,人的個數是不定的,無窮多個

1、不合理 效率很低,用了字串匹配和全表掃描 都是耗時的操作

2、形成了兩個百萬級的大表,關聯查詢效率會很低

我建議三種方案,你自己試驗一下哪種效率最高,因為設計和語句本身沒有效率高低只說,和使用方式和資料量級別有很大的關係,幾萬和百萬優化的策略是完全不同的

建議1:在你的第2種方案的基礎上改進一下,建一個水果字典表c,給每個水果定義一個類似人員的id號,然後表b儲存變成存兩個id關聯,並且這兩個欄位都是索引,表a的人員id要是主鍵並且是唯一索引,然後語句如下:

select * from 表a t where exists (select * from 表b where 水果id in (1,3,4) and 人員id = t.人員id)

建議2:用空間換效率,union在百萬級的效率應該比or要高,所以作為第二種建議,類似於表a的表結構,每類水果都建一個表,然後喜歡這個水果的人就存入這個表,例如表-蘋果,表-西瓜,裡面存的是喜歡這類水果的人員id和名稱,這種方式是避免了查詢,語句如下:

select * from 表-蘋果

union

select * from 表-西瓜

union

select * from 表-香蕉

……建議3:也是用空間換效率,不過用到了or,我估計在百萬級效率會最低,在表a(不要存水果的字串欄位了)的基礎上擴充套件10個欄位,integer型別,分別對應10種水果,每個欄位存0和1兩個值,這10個欄位都建上索引,語句如下:

select * from 表a where 蘋果=1 or 香蕉=1 or ……

2樓:jg_陳

就採用第2種結構好

100萬級別的資料並不是很大的

3樓:匿名使用者

第二個答案是一個簡化的標準解決方案。

對百萬級的人,一般查詢應該是

declare @pid int

select @pid = id from a where name = ' 張三'

select val from b where p_id = @pid

兩段查詢比 join 要快。

多對多的正解應該是3個表。

表 person

id, name, address, telephone, ...

表 fruit

id, name, producer, price, ...

表 like

person_id, fruit_id,

查詢主要針對表 like.

另外,假設表person 有百萬記錄,表 fruit有上百條記錄,表like有可能有幾千萬記錄。

但現代資料庫處理這個數量級沒有問題。

4樓:匿名使用者

選第二種,結構合理些,水果可動態增減,方便。

查詢很簡單 join一下就行了,不會慢。

5樓:匿名使用者

本題涉及到2個實體,以及這兩個實體之間的聯絡.

按照規範化的設計要求,對以上3個物件(2個實體,1個聯絡)分別建表如下:

表一:學生id,學生姓名;

表二:課程id,課程名稱;

表三:學生id,課程id;

如果一個學生只允許最多選2門課程,那麼為了便於查詢得到你要的結果的排列方式,我們通常會降低正規化來設計表結構,這時,你設計的表結構就基本比較合理,但還要稍微改動一下,表一中不要用學生姓名,因為有同名的學生.

改動後的表結構如下:

表一:學生id,學生姓名;

表二:學生id,選修課1編號,選修課2編號;

表三:選修課編號,選修課名稱;

查詢語句參考如下:

select a.學生姓名,

c.選修課名稱 as 選修課1名稱,

d.選修課名稱 as 選修課2名稱

from 表一 a,表二 b,表三 c,表三 dwhere a.學生id=b.學生id

and b.選修課1編號=c.選修課編號

and b.選修課2編號=d.選修課編號

多對多關係,應該怎麼設計資料庫中的表和欄位?

6樓:匿名使用者

select a.顧客 from a,b where a.id=b.顧客id and (d.商品='商品1' and d.商品='商品3')

7樓:匿名使用者

多對多,兩個實體各建一張表,然後再建一張關係表。以你的這個為例,顧客一張表,商品一張表,顧客購買了什麼商品建立一張購物表。

如何在資料庫中表示多對多的關係

8樓:匿名使用者

首先你的兩張主表欄位就是各自的欄位,對於中間表就是把那兩張主表的主鍵加上兩張主表聯絡的屬性加上即可。

9樓:匿名使用者

多對多要用兩個一對多來表示;

10樓:匿名使用者

良好的資料庫設計都是要符合第三正規化或者更加嚴格一些,所以多對多是一種比較不好的設計方案,會對系統的開發和維護造成很大困難,特別是**上,要重複的比較各個鍵值,因此都是採用引入關係表的方法,將兩個表的主鍵提取作為關係表的欄位,然後關係表中設定遊動主鍵,這樣就將多對多的關係解耦成1對多的關係

資料庫sql查詢語句,關於班級資訊,如下 學生名字,編號,班級,成績,把每個班級最大成績前20名,列出來

若為oracle資料庫,則使用rownom來進行查詢select from select from 班級資訊 order by 成績 desc where rownom 20 推薦答案oracle資料庫那個sql語句有問題,查出來的還是表裡面前20條資料,只是把這20條資料給降序排列了,而不是最大成...

SQL資料庫中,模糊查詢的語句怎麼寫

select from abc like 1 你根本就沒有寫在哪個列裡查呀,肯定列名無效咯。select from abc where like 1 正確的應該是 select from 表名 where 欄位 like 1 c 模糊查詢sql語句怎麼寫?假設有表名稱 tb student 欄位 i...

資料庫中多對多的關係用字串,資料庫中多對多的關係用一個字串

no,千萬不要一個欄位儲存多個id,肯定會有問題的。電影表 id 演員 id 關聯電影id 這樣不就ok了。為什麼資料庫中不說多對一關係 多對一不符合二維表的設計規範,也無法滿足唯一的業務規則,所以一般之說一對多。比如一個人可以有多張銀行卡,總不能多個人用一張銀行卡吧 都是說一對多。為什麼?抓主要矛...