如何实施" is-a"父母和孩子有单独的ID时的关系

时间:2016-05-12 00:51:03

标签: java sql sql-server inheritance orm

我有2张桌子:人和用户。每个用户都是一个人。每个人都不是用户。

每张桌子都有自己的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)
);

现在我要定义" is-a" OOP中人与用户的关系。我认为通过定义2个类来简单直接:Person类和User Class这样:

public class Person {
    ...
}

public class User extends Person {
    ...
}

但我很困惑在这种情况下如何处理Id。我认为"是-a"关系只有1个Id在Person类中定义。但在这种情况下,每个表都有自己的Id。我该如何实施" is-a"在这种情况下的关系?

2 个答案:

答案 0 :(得分:0)

数据模式未定义为“is-a”关系,它实际上是1对多,其中1个人可以与多个用户关联。没错,你可以通过业务规则强制实施一对一的关系,但事实并非如此。

就目前而言,你真的有两个不同的ID,你希望将它们视为一个单一的实体,但实际上不可能。我能想到的最好的方法是将属性放在类中,就像它们通过数据映射一样,当你处理这个人时,你将访问父类/表中的ID,当你在处理子类/表中的用户ID。

然而,这绝不是一个干净的设计。

答案 1 :(得分: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)
);

表用户中定义的PK是完全不必要的,因为你有一个user_name,它已经是NOT NULL和UNIQUE,这是主键的基本定义。

同样将person_fk定义为NOT NULL和UNIQUE,您在用户和人之间建立1对1的关系,这样您就可以使用person的主键来识别表用户中的记录。

这样你可以像这样实现你的类:

public class Person {
    protected final int id;
}

public class User extends Person {
    ...

    public int getID() { return this.id }

}