我有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"在这种情况下的关系?
答案 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 }
}