SQL表引用

SQL表引用,sql,Sql,首先,我对这个糟糕的标题感到抱歉,但5分钟后我想不出更好的了 请假设以下情况:有人和银行账户,我希望实现两个表来模拟这一点。一个人有一个ID(主键)和一个名字。银行帐户还具有ID(主键)、所有者(外键)和值。 这是我的密码: create table Person( ID integer primary key, name varchar(200) not null ); create table Account( ID integer primary key, owner i

首先,我对这个糟糕的标题感到抱歉,但5分钟后我想不出更好的了

请假设以下情况:有人和银行账户,我希望实现两个表来模拟这一点。一个人有一个ID(主键)和一个名字。银行帐户还具有ID(主键)、所有者(外键)和值。 这是我的密码:

create table Person(
  ID integer primary key,
  name varchar(200) not null
);

create table Account(
  ID integer primary key,
  owner integer references Person(ID),
  value number not null
);
现在,有没有一种方法可以让一个人“知道”哪些帐户与之关联,而无需
select*from Account where owner=XY
? 我问了我的老师,但没有得到一个答案,甚至与SQL有关。在互联网上,我找不到任何建议,所以我在这里问。
请原谅我这个问题,但我已经习惯了面向对象的语言,在这种语言中,类Person将包含一个可枚举项来存储所有帐户。

这就是关系数据库的工作方式,它们有带有关系的表

因为它是关系型的,所以您可以查询
人员
,并在一次查询中获得与该人员相关的所有
帐户
。要执行此操作,您需要执行一个
JOIN

代码示例
如果您想要一个面向文档的
数据库,您可以使用MongoDB之类的工具,在MongoDB中,您可以将一个
帐户
直接嵌入到一个
个人
文档中。

另一种看待这一点的方法(以及可能更灵活的设计)是使用三个表,Person、Account、PersonAccounts。将person和account视为对象,它们中的任何一个都可以是彼此下面的集合。Person.Accounts(i)或Account.Person(i)这是因为多个人可能在同一个帐户上,或者一个人可能有多个帐户。帐户表中的所有者将位于关联表personAccounts中;然后,要知道一个人拥有哪些帐户,你只需查看PersonAccounts表。这将是一个“n对n”关系,但我想要一个如上所示的“1对1”关系。这意味着,在我当前的设计(或一般的关系设计)中,一个人甚至根本不知道帐户存在。与账户有关系的人;但这也不是一对一的关系。要真正做到1-1,您需要跟踪person表中的帐户;但从编码的角度来看,维持这种关系是有问题的。首先必须创建一个帐户和一个人,然后必须使用其他密钥更新每个记录。你不能。为了加强完整性,您可以使组合唯一,但不是主键。
SELECT * FROM Person
JOIN Account ON (Person.ID = Account.owner)
WHERE Person.ID = XY;