3

曜日をmysqlデータベースに保存する最も効率的な方法を知りたいです。毎週発生するイベントのリストがあり、一致する日のスケジュールとしてリスト形式で返したいと思っています。

これは特定の日付ではなく、1日であるため、どちらが最善の方法かわかりません。

4

4 に答える 4

9

あなたの特定のシナリオでは、ENUM型を使用しますが、読みやすく効率的です。

CREATE TABLE MY_TABLE
(
 -- other fields
  EVENT_DAY ENUM('SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY')
);

WHERE EVENT_DAY = 'FRIDAY'ENUM の優れた点は、MySQL が内部的に数値表現を使用してデータを効率的に格納するため、パフォーマンスを犠牲にすることなく読みやすいクエリ (例: ) を記述できることです。


悪魔の擁護者を演じるために、Chris Komlenic は列挙型の代わりに参照テーブルを推奨する非常に興味深い投稿を書きました。とにかく、あなたの問題は彼の記事「列挙型を使用してもよい場合の基準」に当てはまると思います。また、曜日をモデル化するための参照テーブルは、少しやり過ぎに思えます ( TINYINT2 番目のオプションとして使用します)。

于 2012-08-12T18:00:24.010 に答える
2

平日とその標準 ODBC インデックス番号をテーブルに格納できます。(全体で INNODB エンジンを使用します。)

create table weekdays (
  weekday_num integer primary key,
  day_of_week char(3) not null,
  unique (day_of_week)
);

-- Values correspond to return values from the dayofweek() function.
insert into weekdays values (1, 'Sun');
insert into weekdays values (2, 'Mon');
insert into weekdays values (3, 'Tue');
insert into weekdays values (4, 'Wed');
insert into weekdays values (5, 'Thu');
insert into weekdays values (6, 'Fri');
insert into weekdays values (7, 'Sat');

アプリケーション プログラムが最近の日付とそのインデックスをリストに表示する必要がある場合は、データベースにクエリを実行して適切な値を取得するだけで済みます。(または、実行中にデータベースにクエリを実行してコードを生成しますmake <your_program_name>。)

次に、定期的なイベントのテーブルを作成します。

create table recurring_events (
  event_name varchar(20) primary key,
  day_of_week char(3) not null,
  foreign key (day_of_week) references weekdays (day_of_week)
);

insert into recurring_events values
('Trash pickup', 'Mon'),
('Bookmobile', 'Mon'),
('Grocery store', 'Wed'),
('Tutoring', 'Fri');

結合を使用すると、dbms はテーブル内のすべての行に対して dayofweek() を評価することを回避できるはずです。

select e.*
from recurring_events e
inner join weekdays w on e.day_of_week = w.day_of_week
and dayofweek(current_date) = w.weekday_num;
于 2012-08-12T18:15:54.233 に答える
1

もう 1 つのオプションは、フィールドを使用して、ENUM曜日を整数または文字列形式で格納することです。特定の実装に依存します。

于 2012-08-12T17:48:34.437 に答える
0

通常の日時として保存し、この関数DAYOFWEEK()を使用して曜日を判別します。

たとえば、月曜日に発生するはずのすべての行を返すクエリを実行するとします。

SELECT event
FROM scheduled_events
WHERE DAYOFWEEK(event_datetime) = 2;
于 2012-08-12T17:45:41.480 に答える