鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)/ 數(shù)據(jù)庫(kù)如何儲(chǔ)存“時(shí)間段”才比較合理?

數(shù)據(jù)庫(kù)如何儲(chǔ)存“時(shí)間段”才比較合理?

在開(kāi)發(fā)中,有一些場(chǎng)景我們需要將一個(gè)時(shí)間段的信息存儲(chǔ)到數(shù)據(jù)庫(kù)中,比如說(shuō):一個(gè)事件有開(kāi)始時(shí)間和結(jié)束時(shí)間,我們可以在數(shù)據(jù)庫(kù)中用類似 startDate 和 endDate 這樣的兩個(gè)字段來(lái)儲(chǔ)存。但是如果這個(gè)時(shí)間段是周期性的或者說(shuō)是間斷性的。

比如說(shuō):

儲(chǔ)存一個(gè)課程的上課時(shí)間,這個(gè)課程是每周一、每周三、每周五上課

這樣的話,數(shù)據(jù)庫(kù)的表結(jié)構(gòu)應(yīng)該如何設(shè)計(jì)才比較合理呢?

創(chuàng)建7個(gè)布爾值類型的字段表示周一到周日?

回答
編輯回答
玄鳥(niǎo)

使用兩張表去設(shè)計(jì)會(huì)有更好的擴(kuò)展性。
1.課程表,記錄課程的相關(guān)介紹
2.排課表,記錄上課開(kāi)始時(shí)間,結(jié)束時(shí)間等

這樣的時(shí)間方便以后新增的需求,比如說(shuō)統(tǒng)計(jì)功能,又或者以后會(huì)新增簽到功能。

所以我的意思是…使用一張表專門(mén)去記錄時(shí)間段,有一個(gè)一對(duì)多的關(guān)系。

2018年9月17日 16:40
編輯回答
骨殘心

因?yàn)槲抑豢吹揭贿@么一個(gè)需求,我覺(jué)得你可以使用二進(jìn)制的辦法進(jìn)行計(jì)算。

比如一三五上課,那么存儲(chǔ)的二進(jìn)制的數(shù)據(jù)為10101000;

然后每次查詢星期三是否有課:

select * from table where date & 1 << 2;

上面的SQL我沒(méi)執(zhí)行過(guò)。僅僅是改寫(xiě)。

參考:

clipboard.png

2017年12月4日 02:38
編輯回答
夏木

都是按需求來(lái)的呀
就像你說(shuō)的,如果只有一段時(shí)間,就可以開(kāi)始時(shí)間+結(jié)束時(shí)間,也可以開(kāi)始時(shí)間+持續(xù)時(shí)長(zhǎng)

      如果是周期性的多段時(shí)間,就可以按周期設(shè)置天

那如果要設(shè)計(jì)一個(gè)兼容各種模式的,那可能就會(huì)復(fù)雜一些
可讀性、空間、速度都是此消彼長(zhǎng)的

2017年6月22日 12:29