使用外键的数据库设计 MySQL

Posted

技术标签:

【中文标题】使用外键的数据库设计 MySQL【英文标题】:Database design MySQL using foreign keys 【发布时间】:2010-04-22 04:00:55 【问题描述】:

我在理解如何处理我正在制作的程序的数据库端时遇到了一些麻烦。我在 Kohana 中使用 ORM,但我希望对如何解决此问题的一般理解将引导我使用 ORM 得到答案。

我正在为用户编写一个程序来管理他们的股票研究信息。我的表基本上是这样的:

CREATE TABLE tags(
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
tags VARCHAR(30),
UNIQUE(tags)
)
ENGINE=INNODB DEFAULT CHARSET=utf8;


CREATE TABLE stock_tags(
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
tag_id INT NOT NULL,
stock_id INT NOT NULL,
FOREIGN KEY (tag_id) REFERENCES tags(id),
FOREIGN KEY(stock_id) REFERENCES stocks(id) ON DELETE CASCADE
)
ENGINE=INNODB DEFAULT CHARSET=utf8;


CREATE TABLE notes(
id INT AUTO_INCREMENT NOT NULL,
stock_id INT NOT NULL,
notes TEXT NOT NULL,
FOREIGN KEY (stock_id) REFERENCES stocks(id) ON DELETE CASCADE,
PRIMARY KEY(id)
)
ENGINE=INNODB DEFAULT CHARSET=utf8;


CREATE TABLE links(
id INT AUTO_INCREMENT NOT NULL,
stock_id INT NOT NULL,
links VARCHAR(2083) NOT NULL,
FOREIGN KEY (stock_id) REFERENCES stocks(id) ON DELETE CASCADE,
PRIMARY KEY(id) 
)
ENGINE=INNODB DEFAULT CHARSET=utf8;

如何获取单个股票的所有属性,包括其链接、注释和标签?我是否必须在股票表中添加链接、注释和标签列,然后你怎么称呼它?我知道这与使用 ORM 不同,我假设我可以在 SQL 中使用连接表。

感谢您的帮助,这将真正帮助我更好地理解问题。

【问题讨论】:

【参考方案1】:

您必须使用JOINS 将表格链接在一起

类似

SELECT  *
FROM    stocks s INNER JOIN
        stock_tags st ON s.id = st.stock_id INNER JOIN
        tags t ON st.tag_id = t.id etc...

【讨论】:

谢谢,我就是这么想的。我有点希望它能引导我更多地使用我正在使用的 ORM 并回答它,但事实并非如此。

以上是关于使用外键的数据库设计 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

mysql怎么设置外键?

数据库设计可以不要外键的7个理由

数据库设计中一对多对多对多关系依据外键的实现条件及方法

批量 MySQL 插入,一个主记录,一个带有外键的详细记录

SqlServer数据库外键的困惑

数据库设计的过程中的设置外键的作用