4D v19 R4 は、エイリアス という、新しい ORDA コンセプトとともにリリースされます。エイリアス属性は、計算属性 の論理的かつ補完的な延長です。
このブログでは、エイリアス属性について説明し、その利点と、そのような場合に使用するかについて述べます。
エイリアス属性とは?
エイリアス属性は、その名前が示すように、既存のデータストアオブジェクトの同義語またはショートカットに過ぎません。後で説明するように、計算属性同様、これらは “Entity クラス” において定義します。
元となる属性は、同じデータクラス内の属性である場合もあれば、別のデータクラスのものである場合もあります。計算属性と同様に、エイリアスは、スカラー値、エンティティ、またはエンティティセレクションを参照するために使用されます。
エイリアス属性か計算属性か?
すでに計算属性があるのに、なぜエイリアス属性を使わなければならないのかと思うかもしれません。
簡単なルールで、リスクなく適用することができます
計算が不要で、結果 (スカラー、エンティティ、エンティティセレクション) がパスで表現できる場合には、エイリアス属性を使用すべきだといえます。
例: fathersDad = father.father
何らかの計算 (大文字化、連結、検索、フォーミュラなど) をおこなう必要がある場合は、計算属性でなければなりません。
例: fullname = uppercase (lastname) + firstname
簡単で具体的な例
典型的な例として、会社と従業員を取り上げましょう。
Employeesデータクラス内で、companyName 属性を使用したいとします。
これは、パスでアクセスできる単純なスカラー属性なので、エイリアス属性を使用すればで十分です。4D は、ターゲットが直接使用されているかのように、検索、クエリ、ソートを最適化します。
// Employees Entity クラス
Class extends Entity
Alias companyName company.name
同様に Companiesデータクラスで、employees のリスト (エンティティセレクション) にアクセスしたい場合でも、エイリアスで十分です。
// Companies Entity クラス
Class extends Entity
Alias companyEmployees employees
他方、Employeesデータクラスで、coworkers 属性 (同じマネージャーを持つ従業員のリスト) を使いたい場合、次のように計算属性を作成し、エンティティセレクションを算出する必要があります:
// Employees Entity クラス
Class extends Entity
Function get coworkers()->$entitySelection : cs.Employees
$entitySelection := this.manager.directReports.minus(this)
同じことが Companies テーブルにも当てはまります。部門長のリストなどを表示したい場合は、計算属性が必要となります。
エイリアスの使用場所
次の例題は、以下のストラクチャーに基づいています。People (人) は、学生 (student) または教授 (professor) (あるいはその両方) になることができ、Language (外国語) を教えたり (teaching) 学んだり (learning) することができます。Lessons (授業) は、People (先生および生徒) と Language を結びつけるための中間テーブル (データクラス) です。
テーブルを “平坦化” する
リレーションの存在を隠して、他のデータクラスの属性が、さも特定のデータクラスに直接属しているかのように見せたいとします。
例: Lessons、People、および Language 間のリレーションに基づいて、professor.name 、student.name 、Language.name を使用するのではなく、エイリアス属性を使用して Lessonsデータクラスを平坦化することが望ましい場合があります:
// Lessons Entity クラス
Class extends Entity
Alias professorName professor.name
Alias studentName student.name
Alias languageName language.name
これにより、エイリアス属性を使用して Lessons を表示することができます:
n対Nリレーションを隠す
Lesson 中間データクラスは、すべてのリレーションが定義されている限り、完全に隠すことができます。
上記の例では、各人について次のことが定義できます:
-
- 受講しているレッスン
- 教えているレッスン
- 受け持ちの生徒 (レッスン提供側の場合)
- 担当教授 (レッスン受講側の場合)
// People Entity クラス
Class extends Entity
// 受講レッスンのエンティティセレクション
Alias followedLessons learning.language
// 教えているレッスンのエンティティセレクション
Alias givenLessons teaching.language
// 担当教授のエンティティセレクション
Alias professors learning.professor
// 受け持ち生徒のエンティティセレクション
Alias students teaching.student
まとめ
上記の HDI をチェックして、エイリアス属性の使用例をもっと見てみましょう。また、より詳細な情報については、ドキュメントセンターを参照ください。