【问题标题】:SQLite field with a list of foreign keys带有外键列表的 SQLite 字段
【发布时间】:2013-12-13 17:11:23
【问题描述】:

我正在构建一个 SQLite 数据库来保存我的房地产经纪人的列表。我已经能够使用外键来识别每个代理的列表,但我想在每个代理的记录中列出列表;从代理和列表之间的一对一关系转变为一对多关系。

看这里:http://www.sqlite.org/draft/foreignkeys.html,没有提到“外键列表”字段。我正在尝试的方法可行吗?

我认为,作为一种解决方法,我可能会制作一个包含关系本身的表格,但这似乎不是一个非常干净的解决方案。我查看了这个帖子:SQLite foreign key examples,但我不确定我的元素是否类似于他们在那里描述的多对多关系。

我也愿意接受有关如何做得更好的建议。我应该只在实际列表中包含列表代理的名称,然后从那里查询吗?

CREATE TABLE listings
(
    listing_id        INTEGER PRIMARY KEY AUTOINCREMENT,
    listing_address   TEXT UNIQUE NOT NULL,
    acq_date          DATE
 )

CREATE TABLE agent
(
     agent_id         INTEGER PRIMARY KEY AUTOINCREMENT,
     agent_name       TEXT NOT NULL,
     agent_listings   INTEGER,
     FOREIGN KEY (agent_listings) REFERENCES listings (listing_id) NOT NULL
 )

【问题讨论】:

    标签: sql sqlite foreign-keys one-to-many foreign-key-relationship


    【解决方案1】:

    您需要将外键添加到listings 表中;对于一对多关系,记录外键的是“多”方。

    CREATE TABLE listings
    (
        listing_id        INTEGER PRIMARY KEY AUTOINCREMENT,
        listing_address   TEXT UNIQUE NOT NULL,
        acq_date          DATE
        agent_id          INTEGER,
        FOREIGN KEY (agent_id) REFERENCES agent (agent_id)
    )
    
    CREATE TABLE agent
    (
         agent_id         INTEGER PRIMARY KEY AUTOINCREMENT,
         agent_name       TEXT NOT NULL,
    )
    

    如果您希望列表由多个代理处理(在多对多关系中),您必须添加一个链接表:

    CREATE TABLE listings
    (
        listing_id        INTEGER PRIMARY KEY AUTOINCREMENT,
        listing_address   TEXT UNIQUE NOT NULL,
        acq_date          DATE
    )
    
    CREATE TABLE agent
    (
        agent_id          INTEGER PRIMARY KEY AUTOINCREMENT,
        agent_name        TEXT NOT NULL,
    )
    
    CREATE TABLE agent_listings
    (
        agent_id         INTEGER NOT NULL,
        listing_id       INTEGER NOT NULL,
        UNIQUE (agent_id, listing_id),
        FOREIGN KEY (agent_id) REFERENCES agent (agent_id),
        FOREIGN KEY (listing_id) REFERENCES listings (listing_id),
    )
    

    【讨论】:

    • 'Link Table' 是神奇的词,我现在更好地理解了关系的实现(虽然维基百科似乎更喜欢'Junction Tables')。我现在有点担心,将外键保留在这一边可能会使查询/删除同步等变得非常复杂。难道试图保持列表的元标记直接成为这样的噩梦吗?感谢您回复我。
    • 这就是关系数据库的工作方式;使用外键关系,您可以要求数据库生成两个表的笛卡尔积的子集。数据库通常已经针对这种关系处理进行了优化,您很快就会掌握模型的窍门。
    • 您可以查看foreign key actions 来处理级联(删除一个表中的行会触发其他地方的删除)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2015-10-14
    • 2021-12-09
    • 1970-01-01
    • 2021-09-04
    • 2010-12-19
    相关资源
    最近更新 更多