您在問題標題中使用「優化」一詞,而不解釋您想優化什麼。
如果你在談論查詢性能,那麼你沒有問題。您可以擁有的記錄數由您每天的會話數決定(因爲只有一個團隊可以參加任何特定會話)。如果你每天運行十個會話,每月有三百個記錄。如果每天運行一百次,每月有三千條記錄。這些數據量不大。因此,您通過歪曲數據庫設計來做出一個糟糕的決定,以避免出現不存在的性能問題。
您在其中一條評論中提到了電子表格。這不是一個糟糕的設計。沿着第一排有一些會議,一邊是團隊,另一邊是細胞顯示一個團隊是否出席了會議。這些映射到三個數據庫表:SESSIONS,TEAMS和相交表TEAM_SESSIONS。團隊出席會議時,您只需要TEAM_SESSIONS中的記錄。
作爲一個概念證明,我在Oracle中敲了三張表。
SQL> desc teams
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
NAME VARCHAR2(20 CHAR)
SQL> desc sessions
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
SSN_DAY DATE
SSN_START NUMBER(4,2)
SSN_END NUMBER(4,2)
SQL> desc team_sessions
Name Null? Type
----------------------------------------- -------- ----------------------------
TEAM_ID NOT NULL NUMBER
SESSION_ID NOT NULL NUMBER
SQL>
在Oracle 11g中引入的PIVOT功能使它成爲不在話下敲了一個矩陣(DBMS的不同口味都會有不同的方法可以解決這個)。正如你所看到的,今天有三支球隊已經預定了會議,沒有人希望在午餐時間訓練,並且Bec United非常熱衷於芥末(或者需要訓練)!
SQL> select * from (
2 select t.name as team_name
3 , trim(to_char(s.ssn_start))||'-'||trim(to_char(s.ssn_end)) as ssn
4 , case when ts.team_id is not null then 1 else 0 end as present
5 from sessions s
6 cross join teams t
7 left outer join team_sessions ts
8 on (ts.team_id = t.id
9 and ts.session_id = s.id)
10 where s.ssn_day = trunc(sysdate)
11 )
12 pivot
13 (sum (present)
14 for ssn in ('9-11', '11-13', '13-15', '15-17', '17-19')
15 )
16 order by team_name
17/
TEAM_NAME '9-11' '11-13' '13-15' '15-17' '17-19'
-------------------- ---------- ---------- ---------- ---------- ----------
Balham Blazers 0 1 0 0 0
Bec United 1 0 0 0 1
Dinamo Tooting 0 0 0 0 0
Melchester Rovers 0 0 0 1 0
SQL>
無論如何,這個數據模型的優點在於它是靈活的。我們可以統計一個團隊參加的頻率,他們參加的次數,他們參加的一週中的哪一天,總是預定什麼會話,什麼會議很少預訂等等。另外,管理數據很容易。特別是,三表解決方案優於兩個表格的優點是,防止重複預訂和非標準或重疊時隙更容易。
你看,規範化不僅僅是一些我們用來詛咒無辜的月亮語言,它提供了真正的實際好處。有少數情況下駕車至少BCNF不是最好的主意。
來源
2010-07-07 12:39:38
APC
正在轉向這種模式。你如何查詢一個月的所有用戶出勤記錄?你將如何加入AttMst表? – Sam 2010-07-07 09:24:03
'select date,userid from AttMst am,AttDet ad where am.id = ad.id group by date'這將顯示日期現在的用戶。但它是未經測試的查詢請檢查它。 – Himadri 2010-07-07 09:39:42