---
# System prepended metadata

title: 2021-03-31 Pair-A v2 定例
tags: [Pair-A v2]

---

# 2021-03-31 Pair-A v2 定例

## 疑問
### 粟田
#### 履歴を保持する必要があるテーブル設計
注文履歴のようなデータの場合、マスタと直接紐付けてしまうとマスタの変更によって履歴が変わってしまう。
対処方法としては、マスタに更新履歴を持たせるか、その時のマスタのデータをコピーして保持しておく2つが思い浮かんだ。
このようなケースでは、どうやって設計をするのが良いか？
（履歴が変わってはいけないという仕様があることを前提とする）

- コピーする場合
    - 参照整合性がないデータが生まれてしまう
- 更新履歴を持つ場合
  - マスターをどんどん追加していって、古いものは古いとわかるようにする
  - 最新と過去のマスタテーブルを分ける

例えば寿司の名前が変わったとして、注文履歴としては同じ寿司として集計できなければいけないのでは？

#### PenPenのインターバルをどうやって持つか
ソースコードに手を入れずにインターバルを自由に設定したかった
`/penpen @user 例のお仕事、お願いしますね！ every 3 days`
`/penpen @user 例のお仕事、お願いしますね！ every 3 hours`
`/penpen @user 例のお仕事、お願いしますね！ every 1 weeks`

全てインターバルは時間で表すことも考えたが、それだとアプリケーションに依存してしまう
- `every 3 days`から`72`という数値をアプリが導き出さなければならない
- もし時間も指定できるようにしたら？アプリの計算処理に修正が必要になる。

データベースの値を変えるだけで、設定できるインターバルを自由に追加できるような設計はないか？ 
とか色々考えると、何が正解なのかよく分からなかった

```
every(1) 2 day(24) = 48h
onceEvery(2) 2 day(24) = 96h
```

### 玄徳

#### DBモデリング3について

ディレクトリの階層構造を表現するために閉包テーブルを使う方法を考えてみたが、ユーザーのルートディレクトリを特定するうまい方法が思いつかなかった。

- ユーザーとルートディレクトリを紐付けるテーブルを用意した。
- is_rootを用意する
- depth

質問する

#### DBモデリング4について

penpenの実際のER図があれば見せてほしい。

質問する

### 永井
- モデリング2
- 文字の無いメッセージの場合、どのように表現すべきか。
    - ~~nullで表現~~
    - ""で表現

```sql
create table Messages(
     MessageId int auto_increment,
     channelId int not null ,
     userId int not null ,
     text varchar(100) not null ,
     postAt TIMESTAMP,
     primary key(MessageId),
     foreign key(channelId) references Channels(channelId),
     foreign key(userId) references Users(userId)
 );
```


###### Tags: `Pair-A v2`