MySql数据库架构引用问题

时间:2011-01-19 23:48:51

标签: mysql database-design schema-design

我有以下表格;这将保存有关各类文章的信息。 我需要一些帮助,为此提出适当的架构。

表格是:

CREATE TABLE IF NOT EXISTS `math_articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(250) NOT NULL,
  `body` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `title` (`title`)
)
CREATE TABLE IF NOT EXISTS `news_articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(250) NOT NULL,
  `body` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `title` (`title`)
)
CREATE TABLE IF NOT EXISTS `other_articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(250) NOT NULL,
  `body` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `title` (`title`)
)
CREATE TABLE IF NOT EXISTS `references` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `article_from_table_name` text NOT NULL,
  `from_id` int(11) NOT NULL,
  `article_to_table_name` text NOT NULL,
  `to_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
)

插入测试数据:

INSERT INTO  `TEST`.`math_articles` (
`id` ,
`title` ,
`body`
)
VALUES (
NULL ,  'fibonacci sequences',  'fib sequences are: 0,1,1,2,3,5...also see article Leonardo of Pisa'
);

由于这个math_articles.title ='斐波那契序列'提到那篇文章'比萨的莱昂纳多',我的程序会将以下数据插入到other_articles表中:

INSERT INTO  `TEST`.`other_articles` (
`id` ,
`title` ,
`body`
)
VALUES (
NULL ,  'Leonardo of Pisa', 'Leonardo of Pisa also known as Leonardo of Pisa, Leonardo Pisano, Leonardo Bonacci, Leonardo Fibonacci, or, most commonly, simply Fibonacci, was.....'
);

关于表引用的模式问题

由于表math_articles.title ='fibonacci sequences'中引用了表other_articles.title ='Leonardo of Pisa',我将在引用表中保存此引用,如下所示:

不确定/问题是否插入引用表

INSERT INTO `TEST`.`references` 
(`id`, `article_from_table_name`, `from_id`, `article_to_table_name`, `to_id`) 
VALUES
(NULL, 'math_articles', '1', 'other_articles', '1');

什么是保存这些参考资料的最佳方式?

我对引用表模式的问题!

  • 两列article_from_table_name和article_to_table_name的数据类型是文本,但它们是我数据库中的实际表。
  • from_id和to_id应该是他们的预期表的forign键  from_id = article_from_table_name.id和to_id = article_to_table_name.id 我不知道如何在架构中定义它。
  • 如果我删除文章math_articles.title ='fibonacci sequences'然后引用表也要更新,我知道我应该使用某种“ON DELETE CASCADE”触发器。

    • 此致

1 个答案:

答案 0 :(得分:1)

您的数据库设计导致了大部分问题。你的三篇文章表,数学,新闻和其他都应该是一个带有类型列的表,以区分不同的类型。然后,可以直接设置一个引用表,其中包含两个外键到articles表,一个用于源文章,另一个用于参考文章。

我通常在应用程序本身而不是数据库层中管理引用完整性,以便所有业务逻辑都在一个地方。因此,如果删除文章,那么应用程序本身应删除任何引用条目。

希望有所帮助!