WixStudioでVeloを使う Memo 1 「プライマリフィールドとIDフィールド」
はじめに
Wixのコレクションは大変便利。ただ、最近までサッパリ理解出来ない部分があった。それはプライマリフィールドとシステムによって作成されるIDフィールド。この使い分けがわからずなんとなく使っていた。いや、もしかすると、今も都合よく理解したつもりになっているだけの可能性が十分にある。少し整理してメモ。
プライマリフィールドとIDフィールド
結論
コレクション同士の参照は、システムによって管理されているIDフィールドの値を使って実現される。プライマリフィールドの値を使って参照されるわけではない。プライマリフィールドは参照アイテムを設定する場合に、ラベルとして表示されるアイテムの代表的なフィールド。
参照はIDフィールドの値で実現する
説明(というか整理)
- 参照タイプのフィールドを持つコレクションがある。このコレクションを「参照コレクション」と呼ぶことにする。
- さらに参照タイプのフィールドを「参照フィールド」と呼ぶことにする。
- 参照コレクションのアイテムは、「参照アイテム」と呼ぶことにする。参照アイテムは参照フィールドを持つことになる。
- 参照フィールドには、参照フィールドに指定したコレクションから任意のアイテムをセットすることができる。参照フィールドに指定したコレクションを「被参照コレクション」と呼ぶことにする。
- 参照フィールドには、被参照コレクションの任意のアイテムを設定することができる。この参照されたアイテムを「被参照アイテム」と呼ぶことにする。
参照と被参照
参照フィールドの設定
参照フィールドを作成する時は、フィールドタイプを「参照」にする。参照先コレクションが重要で、どのコレクションのアイテムを参照するフィールドにするのか指定する。この例ではCarsコレクションのアイテムを参照するフィールドとして設定している。
参照フィールドの設定
参照先のコレクションを設定するが、参照先のコレクションのフィールドは特に指定しない。被参照フィールドはIDになる。
システムフィールド:ID
参照フィールドにセットされた被参照アイテムは、IDフィールドの値によって実現されている。
すべてのコレクションのすべてのアイテムはIDを持っている。IDはアイテムの識別子。重複が発生しないように管理されている。IDの値も基本的にはシステムによって生成され管理される。(CSVファイルからデータをインポートする際には、IDの値も指定できるらしい。)
IDフィールドはシステムが管理する
IDの値がわかればアイテムも特定できる。これが識別子。重複しない情報。車のナンバープレートのようなものだと考えればいい。参照フィールドに被参照アイテムのIDがセットされていれば、被参照アイテムが特定できる。
IDフィールドは全てのアイテムが持っている
例えば、ショッピングモールでもイメージする。あるお客様に対し「所有している車のナンバープレート」を確認する。その後、駐車場で車のナンバープレートを確認して回れば該当する車が探し出せる。あるお客様と車を結びつける情報はナンバープレートによって実現される。探し出した車は「被参照アイテム」として考えることができる。駐車場は「被参照コレクション」。あるお客様は「参照アイテム」。ナンバープレートは「ID」になる。
プライマリフィールド
アイテムを識別するためにわかりやすい情報。この「わかりやすい」という点は結構重要。被参照アイテムを選択する人にとってわかりやすい情報でなければならない。プライマリフィールドは、被参照アイテムを選択操作するための参考情報として提示される。アイテムを識別する際の参考なのでそのアイテムを簡潔に表現しかつ、重複は避けたほうがいい。プライマリフィールドに関する説明を調べていると「参照」って言葉が出てくる。しかし、あくまで参考情報。参照を実現するような役割はになっていない。参考情報というよりは、そのアイテムを代表する値の方が適切な気がしてきた。
プライマリフィールドには旗印
プライマリフィールドは参考情報
IDがあるのだから、不要にも思える。しかし、IDフィールドの値にも問題がある。システムによって生成されるIDの値は、そのアイテムの特性を考慮していない。要は、ランダムな半角英数が並ぶだけ。人間にとって、そのIDの値からアイテムを識別するのは難しい。
IDとプライマリフィールド
例えば、駐車場から車の特定をする場合を考える。IDフィールドの値を「ナンバープレート」として、ナンバープレートがわかると正確な特定が可能になる。でも、駐車場にある車から探し出すには1台1台確認する必要がある。対して、プライマリフィールドの値は正確さよりもわかりやすさを優先する。「日産の赤いミニバン。側面に少し傷あり。」といった感じ。ザックリとしつつも人間にとってはわかりやすい。なんとなく識別ができる。ただ、正確じゃない。
まとめ
誰もが混乱するわけじゃないと思う。ただ、リレーショナルデータベースの考え方というか常識が邪魔をする。特に「プライマリフィールド」という名称。データベースでプライマリといえば「主キー」をさす。主キーと言えば重複を許さない、そして一意にアイテムを特定出来るそんな識別情報。だから、もちろんコレクションにおけるプライマリフィールドもそれと同じかと思ってしまう。しかし、IDフィールドは別に存在していて、データベースの主キーと同じ役割を担う。IDフィールドによって正確な参照が実現される。プライマリフィールドは、アイテムを識別するためのわかりやすい代表フィールド。プライマリフィールドの値を重複させないためには、beforeInsert
やbeforeUpdate
などのデータフックを使って、重複データの回避が必要。
Discussion