我有两个表格,类别和信息。
类别如下:
id | name
信息看起来像:
id | parent_id | name | url
parent_id是类别中的id。
我有一个表单,用户可以在其中添加多个网址。可以按下一个按钮以显示更多的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|
当我查看一个或两个或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");
答案 0 :(得分:0)
不,这里正确的解决方案是另一个表,可能称为“info_urls”,它使用info-to-urls对一对多进行建模。
这是一种“规范化”设计,每个“信息”允许无限制的网址,并且很容易查询:
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 行而不是列:-)(并且非常擅长加入它们一起查询)
答案 1 :(得分:0)
如果你走那条路,你会得到一堆带有空值的列,并遇到查询问题,这正是你所描述的。
我会创建一个不同的表(可能是网址),用info
和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