0

我有两个表,类别和信息。

类别看起来像:

id | name 

信息看起来像:

id | parent_id | name | url

parent_id 是类别中的 id。

我有一个表单,用户可以在其中添加多个 url。有一个按钮可以按下以显示更多的 url 字段。如果有多个 url,则将 url2、url3 等添加到数据库中。

然后信息将如下所示:

id | parent_id | name | url | url2 | url3

这是一个合适的方法吗?

如果是这样,如果信息是这样的:

id | parent_id |name  |url            |url2          |url3
1  | 1         |One   |http://cnn.com |
2  | 1         |Two   |http://msn.com |http://aol.com|

当我查看 One or Two 或 w/e 时,如何查询以获取他们的网址?

我知道我可以做到:

$mysqli->query("SELECT i.url FROM info AS i LEFT JOIN categories AS c ON i.parent_id = c.id");

但这取决于我放置 i.url、i.url2、i.url3 并且我必须为每个信息创建一个单独的查询。我想要它,以便 PHP 确定要选择的 i.url 数量和内容。

所以应该是:

$mysqli->query("SELECT (PHP determines what i.url to put here depending on what info page I'm viewing) FROM info AS i LEFT JOIN categories AS c ON i.parent_id = c.id");
4

2 回答 2

0

如果您走这条路,您将有一堆具有空值的列并遇到查询问题,这几乎就是您所描述的。

info我会创建一个与urls映射的不同表(可能是 url) 。例如:

url_id | info_id | url 

这是重复属性设计模式,这里简要说明: http ://www.tomjewett.com/dbdesign/dbdesign.php?page=phone.php

以下是有关如何查询的示例:

SELECT i.*, url
FROM info i JOIN urls u ON i.id = u.info_id
于 2012-12-17T04:16:55.170 回答
0

不,这里正确的解决方案是另一个表,可能称为“info_urls”,它使用 info-to-urls 建模一对多。

这是一个“规范化”的设计,每个“信息”将允许无限的 URL,并且很容易查询:

SELECT name, GROUP_CONCAT(info_urls.url) as urls 
FROM info JOIN info_urls ON info.id = info_urls.info_id;

列将如下所示:

id
info_id
url

该解决方案模拟了您不知道用户将输入多少个 URL,并且您的 RDBMS 是针对 CRUD而不是列 :-) 的现实(并且非常擅长将它们连接在一起以进行查询)

于 2012-12-17T04:16:32.373 回答