2016-05-12 8 views
1

私は2人のテーブル:personとuserを持っています。各ユーザーは個人です。それぞれの人はユーザーではありません。親と子が別個のIDを持つときに "is-a"関係を実装する方法

各テーブルには独自のPKがあります。これはテーブルのDDLです。

CREATE TABLE person (
    person_pk int NOT NULL PRIMARY KEY, 
    first_name varchar(50) NOT NULL, 
    middle_name varchar(50) NULL, 
    last_name varchar(50) NOT NULL 
); 

CREATE TABLE user (
    user_pk int NOT NULL PRIMARY KEY, 
    user_name varchar(50) NOT NULL UNIQUE, 
    password varchar(255) NOT NULL, 
    person_fk int NOT NULL FOREIGN KEY REFERENCES person(person_pk) 
); 

ここで、OOPで人とユーザーの「is-a」関係を定義します。 Personクラスとユーザークラスこうして:私は2つのクラスを定義することで、それは簡単だろうと思った

public class Person { 
    ... 
} 

public class User extends Person { 
    ... 
} 

しかし、私は、この場合のidを処理する方法について混乱しています。私は、 "is-a"関係にPersonクラスで定義されているIdが1つしかないと考えました。しかし、この場合、各テーブルには独自のIDがあります。この場合、どうすれば "is-a"関係を実装できますか?

+0

この方法であなたは、このようなあなたのクラスを実装することができます。 Eclipse JPAリバースエンジニアリングを使用して、エンティティオブジェクト –

答えて

0

データモードは「is-a」関係として定義されていません。実際には、1人が複数のユーザーに関連付けられる1対多の関係です。ビジネスルールを使って1対1の関係を強制することはできますが、実際はそうではありません。

本当に、あなたは単一のエンティティとして扱うことを望んでいたが、本当にできない2つの異なるIDを持っています。私が思いつくことができる最高ののは、データを使ってマッピングされたときと同じように、クラスに属性を配置することです。親クラス/テーブルのIDにアクセスする人を扱うときと、子クラス/テーブル内のユーザーIDを処理します。

しかし、これは決してクリーンなデザインではありません。あなたが記述何をすべきか

+0

を作成してみてください。これは、「has-a」関係として扱う必要がありますか?これは理にかなっていますか? 'public class Person {プライベートint personId;プライベートリストユーザー; ...} 'と' public class User {プライベートint userId;私的な人物。 ...} ' – srh

0

一つの方法は、あなたのテーブルこの方法を再定義することです:

CREATE TABLE person (
    id int NOT NULL PRIMARY KEY, 
    first_name varchar(50) NOT NULL, 
    middle_name varchar(50) NULL, 
    last_name varchar(50) NOT NULL 
); 

CREATE TABLE user (
    user_name varchar(50) PRIMARY KEY, 
    password varchar(255) NOT NULL, 
    person_fk int NOT NULL UNIQUE, 
    FOREIGN KEY (person_fk) REFERENCES person(id) 
); 

すでにNULLと一意でないUSER_NAMEを持っているように、テーブルのユーザーで定義されたPKは、完全にunnecesaryあり、これは主キーの基本的な定義です。

また、person_fkをNOT NULLおよびUNIQUEとして定義すると、ユーザーと人の間に1対1の関係が確立されるため、personの主キーを使用してtableユーザーのレコードを識別できます。あなたは `person`テーブル(外部キー)にリンク列` person_fk`を持っているあなたの `user`テーブルの上に

public class Person { 
    protected final int id; 
} 

public class User extends Person { 
    ... 

    public int getID() { return this.id } 

} 
+0

1人は複数のユーザー名を持つことができます。 'user'テーブルの' person_fk'は一意ではありません。 – srh

関連する問題