PHP/SQL不确定如何处理

PHP/SQL不确定如何处理,php,mysql,sql,Php,Mysql,Sql,我有两个表,类别和信息 类别如下所示: id | name id | parent_id | name | url 信息看起来像: id | name id | parent_id | name | url parent_id是类别中的id 我有一个表单,用户可以在其中添加多个url。有一个按钮,可以按下,使更多的url字段出现。如果存在多个url,则会将url2、url3等添加到数据库中 信息将如下所示: id | parent_id | name | url | url2 | u

我有两个表,类别和信息

类别如下所示:

id | name 
id | parent_id | name | url
信息看起来像:

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|
id
info_id
url
当我查看一个或两个或w/e时,如何查询以获取他们的URL?

我知道我能做到:

$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");

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

这是一种“标准化”设计,允许每个“信息”有无限的URL,并且很容易查询:

SELECT name, GROUP_CONCAT(info_urls.url) as urls 
FROM info JOIN info_urls ON info.id = info_urls.info_id;
SELECT i.*, url
FROM info i JOIN urls u ON i.id = u.info_id
这些列将如下所示:

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

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

如果您选择该路径,您将有一组列具有空值,并且会遇到查询问题,这和你描述的差不多

我会创建一个不同的表(可能是url),将
info
映射到
url
s。例如:

url_id | info_id | url 
这是重复属性设计模式,此处简要说明:

下面是一个关于如何查询的示例:

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

url2、url3字段号是常量还是无限制?