あなたが求めていることの多くは、それがあなたのニーズに最適であるとあなたが考える方法に要約されます。うまくいけば、私が以下に言うことのいくつかが役立つでしょう。
1対1のテーブルは必ずしも悪いわけではなく、実際、データを分割して取得をより効率的にするために使用されることもあります。たとえば、頻繁に使用するフィールドが10個あり、あまり使用しない比較的大きいフィールドが25個ある場合は、データベースエンジンが使用しないように、25個を別の1対1のテーブルに配置できます。あなたがいつも使っている10のフィールドを引っ掛けているとき、彼らと一緒にいじくり回さなければなりません。
あなたの場合、私はどちらにでも行くことができます。経験豊富な開発者でない限り、住所フィールドをレストランのテーブルに配置することをお勧めします。あなたはそれを考えすぎたくない。派手になりすぎようとすると、決して起こらないかもしれない何かに多くの時間と労力を浪費するだけになるでしょう。さらに、後で住所テーブルのデータを変更することにした場合、正直なところ、レストランのテーブルで直接実行するよりも、住所テーブルでいくつかのALTERTABLEコマンドを実行する方が簡単ではありません。つまり、後で変更することがわかっている場合を除いて、シンプルに保ちます。
時間に関しては、一部のデータベースシステムは実際にはTIMEタイプ(日付付き)をサポートしています。たとえば、これはMySQLのドキュメントです。もう1つのオプションは、標準のDATETIMEを使用することですが、参照ポイントとして特定の日付を使用します。たとえば、1970年1月1日です。したがって、午後3時30分に保存する場合は、「1970-01-0115:30:00」として保存します。時間部分だけを表示したいバックエンドで任意のフォーマットを実行できます。これの利点の1つは、最終的にこれらの時間を任意の種類の計算で使用する場合、VARCHARとしてよりもDATETIMEとして保存する方がはるかに簡単なことです。たとえば、特定の日にレストランが開いている時間を知りたい場合は、次のように使用できます。
SELECT `closetime` - `opentime` AS "openhours" FROM `restaurants`;
曜日の保存については、正直、TINYINTにして、1(日曜日)から7(土曜日)まで保存します。MySQLには、曜日として1から7を返す組み込み関数があり、ほとんどのデータベースは同じであると思います。以下のようなクエリでは、特定の日付が「特別な」日であるかどうかを判断するのがはるかに簡単になります。
SELECT * FROM `restaurants` where DAYOFWEEK(?) = `special_day`
ほとんどのスクリプト言語では、それを準備されたクエリとしてコンパイルでき、日付を非常に効率的にパイプすることができます。
うまくいけば、これはあなたにいくつかの考慮事項を助け、与えるでしょう。あなたのプロジェクトで頑張ってください、特にあなたがタイムスパンなどに入り始めたとき、日付と時間は対処するのに本当に厄介になる可能性があります。