问题描述
抱歉,这太简单了,但是我是数据库新手。 假设我有一个包含两个表的数据库,一个表用于人员,一个表用于国家。 每个人都有一个与之相关的国家。 我想以懒惰的方式将这些表中的项目加载到python对象中。 现在,我正在遍历“人员”中的所有行并为它们实例化对象。 因此,对于每个“人”,我都有一个对象,现在,如果我要访问与某人相关联的国家/地区,则将获得country_id并实例化一个全新的“国家”实例(即使所有人都具有相同的国家/地区)。 例如,如果person1.country为XXX,person2.country为XXX,则对象ID不同
class Person(object):
def __init__(self, id):
self.id = id
def country():
...
country_id = (gets id from db here)
self.country = Country(country_id)
所以我会得到
id(person1.country) -> 123
id(person2.country) -> 456
让两个人共享同一个国家/地区实例的最Python方式是什么?
谢谢您的帮助
1楼
您可以将Country
实施为单例模式。
尽管我要问-为什么重要呢?
只要person1.country == person2.country
,为什么person1.country == person2.country
关心ID是否相同?
2楼
您可以与许多国家/地区建立多人一对一关系。 人员将具有country_id作为关联国家/地区ID的外键约束。 您基本上必须对关联的国家/地区进行查找,并从国家/地区分配正确的ID。 对于国家/地区表,您可能希望将所有已知国家/地区预填到该表中。
如果您决定删除国家/地区表中的条目,该约束可防止您拥有不匹配的ID。 您可以定义其他属性,例如从表中删除国家或更新国家后如何删除条目。 也就是说,您可以在人员表中将country_id设置为null或删除与该国家/地区关联的所有人员。 查找外键约束,您应该找到有关各种约束属性的更多材料。 如果仍然有与该条目关联的人,则可以将其删除为非法。
CREATE TABLE Person (
id BIGINT NOT NULL,
country_id BIGINT NOT NULL,
etc ...,
PRIMARY KEY(id),
FOREIGN KEY(country_id) REFRENCES Country(id)
)
CREATE TABLE Country(
id BIGINT NOT NULL,
etc..,
)