我的数据库模型(糟透了)让人头疼,如何改进它?
My database model (sucks) gives to mush headache, how to improve it?
我有一个关于在用户之间共享衣橱的应用程序。想法很简单,会员发布自己的衣服,其他人可以评论或按赞按钮保存。
我有三个table:
产品:
+-------------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+-------------------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| NAME | varchar(16) | NO | | NULL | |
| FBID | varchar(32) | NO | | NULL | |
| TITLE | text | NO | | NULL | |
| DESCRIPTION | text | NO | | NULL | |
| BRAND | varchar(16) | NO | | NULL | |
| SIZE | varchar(12) | NO | | NULL | |
| CATEGORY | varchar(22) | NO | | NULL | |
| COLOR | varchar(12) | NO | | NULL | |
| COND | varchar(12) | NO | | NULL | |
| ORIGPRICE | varchar(8) | NO | | 0 | |
| SALEPRICE | varchar(8) | NO | | 0 | |
| IMAGES | text | NO | | NULL | |
| TIMESTAMP | timestamp | NO | | CURRENT_TIMESTAMP | |
| SOLDSTATUS | varchar(1) | NO | | 0 | |
| VIEWS | int(6) | NO | | 0 | |
| RECOMMENDED | varchar(1) | NO | | 0 | |
+-------------+-------------+------+-----+-------------------+----------------+
喜欢:
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| PRODID | varchar(11) | NO | | NULL | |
| FBID | varchar(32) | NO | | NULL | |
+--------+-------------+------+-----+---------+----------------+
评论:
+-----------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+-------------------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| PRODID | int(11) | NO | | NULL | |
| NAME | varchar(32) | NO | | NULL | |
| FBID | varchar(32) | NO | | NULL | |
| COMMENT | text | NO | | NULL | |
| IMGPATH | text | NO | | NULL | |
| TIMESTAMP | timestamp | NO | | CURRENT_TIMESTAMP | |
+-----------+-------------+------+-----+-------------------+----------------+
到目前为止,(我想我在这里出错了),为了在主页上显示产品以及 likes/comments 的数量,我使用查询中嵌入的单独函数进行了子查询,例如:
$query = "SELECT * FORM PRODUCTS"
if($result = mysqli_query($mysqli, $query)) {
while($row = mysqli_fetch_assoc($result)){
$jsonRow = array(
'sqlId' => $row['ID'],
'name' => $row['NAME'],
'likecount' => countLikes($row['ID'], $mysqli),
'commentcount' => countComments($row['ID'], $mysqli)
);
}
现在,在 10.000 多条记录之后,为了提高性能,我尝试过:
- 要加入所有三个 table,但这样我就可以对喜欢的事物进行分组/计数,而不可能同时计算评论。
- 或者,为 PRODUCTS table 中的 LIKESCOUNT 创建新列,并在每次用户喜欢产品时通过计算产品在 LIKES table 中的出现次数 (PRODID) 来更新此列。
关于如何做到这一点还有其他想法吗?
谢谢
To JOIN all three tables, but this way I can group / count things once for LIKES without the possibility of counting COMMENTS in the same time.
您可以在一次查询中统计“赞”和“评论”。但是您需要使用子查询(以免在 LIKES 和 COMMENTS 之间创建交叉连接)。
select sub.*, count(l.PRODID) as likecount
from (
select p.*, count(c.PRODID) as commentcount
from products p
left join comments c on c.PRODID = p.ID
group by p.ID
) sub
left join likes l on l.PRODID = sub.ID
group by sub.ID
您还可以在子选择中计算评论和喜欢。
select p.*,
(
select count(*)
from comments c
where c.PRODID = p.ID
) as commentcount,
(
select count(*)
from likes l
where l.PRODID = p.ID
) as likecount
from products p
但我可能会 运行 三个查询
select * from products;
select PRODID, count(*) as commentcount from comments group by PRODID;
select PRODID, count(*) as likecount from likes group by PRODID;
并将结果合并到 PHP。
$products = array();
$query = "SELECT * FORM PRODUCTS";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
$products[$row['ID']] = array(
'sqlId' => $row['ID'],
'name' => $row['NAME'],
'likecount' => 0,
'commentcount' => 0
);
}
$query = "SELECT PRODID, COUNT(*) as commentcount FROM comments GROUP BY PRODID";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
$products[$row['PRODID']]['commentcount'] = $row['commentcount'];
}
$query = "SELECT PRODID, COUNT(*) as likecount FROM likes GROUP BY PRODID";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
$products[$row['PRODID']]['likecount'] = $row['likecount'];
}
我有一个关于在用户之间共享衣橱的应用程序。想法很简单,会员发布自己的衣服,其他人可以评论或按赞按钮保存。
我有三个table:
产品:
+-------------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+-------------------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| NAME | varchar(16) | NO | | NULL | |
| FBID | varchar(32) | NO | | NULL | |
| TITLE | text | NO | | NULL | |
| DESCRIPTION | text | NO | | NULL | |
| BRAND | varchar(16) | NO | | NULL | |
| SIZE | varchar(12) | NO | | NULL | |
| CATEGORY | varchar(22) | NO | | NULL | |
| COLOR | varchar(12) | NO | | NULL | |
| COND | varchar(12) | NO | | NULL | |
| ORIGPRICE | varchar(8) | NO | | 0 | |
| SALEPRICE | varchar(8) | NO | | 0 | |
| IMAGES | text | NO | | NULL | |
| TIMESTAMP | timestamp | NO | | CURRENT_TIMESTAMP | |
| SOLDSTATUS | varchar(1) | NO | | 0 | |
| VIEWS | int(6) | NO | | 0 | |
| RECOMMENDED | varchar(1) | NO | | 0 | |
+-------------+-------------+------+-----+-------------------+----------------+
喜欢:
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| PRODID | varchar(11) | NO | | NULL | |
| FBID | varchar(32) | NO | | NULL | |
+--------+-------------+------+-----+---------+----------------+
评论:
+-----------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+-------------------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| PRODID | int(11) | NO | | NULL | |
| NAME | varchar(32) | NO | | NULL | |
| FBID | varchar(32) | NO | | NULL | |
| COMMENT | text | NO | | NULL | |
| IMGPATH | text | NO | | NULL | |
| TIMESTAMP | timestamp | NO | | CURRENT_TIMESTAMP | |
+-----------+-------------+------+-----+-------------------+----------------+
到目前为止,(我想我在这里出错了),为了在主页上显示产品以及 likes/comments 的数量,我使用查询中嵌入的单独函数进行了子查询,例如:
$query = "SELECT * FORM PRODUCTS"
if($result = mysqli_query($mysqli, $query)) {
while($row = mysqli_fetch_assoc($result)){
$jsonRow = array(
'sqlId' => $row['ID'],
'name' => $row['NAME'],
'likecount' => countLikes($row['ID'], $mysqli),
'commentcount' => countComments($row['ID'], $mysqli)
);
}
现在,在 10.000 多条记录之后,为了提高性能,我尝试过:
- 要加入所有三个 table,但这样我就可以对喜欢的事物进行分组/计数,而不可能同时计算评论。
- 或者,为 PRODUCTS table 中的 LIKESCOUNT 创建新列,并在每次用户喜欢产品时通过计算产品在 LIKES table 中的出现次数 (PRODID) 来更新此列。
关于如何做到这一点还有其他想法吗? 谢谢
To JOIN all three tables, but this way I can group / count things once for LIKES without the possibility of counting COMMENTS in the same time.
您可以在一次查询中统计“赞”和“评论”。但是您需要使用子查询(以免在 LIKES 和 COMMENTS 之间创建交叉连接)。
select sub.*, count(l.PRODID) as likecount
from (
select p.*, count(c.PRODID) as commentcount
from products p
left join comments c on c.PRODID = p.ID
group by p.ID
) sub
left join likes l on l.PRODID = sub.ID
group by sub.ID
您还可以在子选择中计算评论和喜欢。
select p.*,
(
select count(*)
from comments c
where c.PRODID = p.ID
) as commentcount,
(
select count(*)
from likes l
where l.PRODID = p.ID
) as likecount
from products p
但我可能会 运行 三个查询
select * from products;
select PRODID, count(*) as commentcount from comments group by PRODID;
select PRODID, count(*) as likecount from likes group by PRODID;
并将结果合并到 PHP。
$products = array();
$query = "SELECT * FORM PRODUCTS";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
$products[$row['ID']] = array(
'sqlId' => $row['ID'],
'name' => $row['NAME'],
'likecount' => 0,
'commentcount' => 0
);
}
$query = "SELECT PRODID, COUNT(*) as commentcount FROM comments GROUP BY PRODID";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
$products[$row['PRODID']]['commentcount'] = $row['commentcount'];
}
$query = "SELECT PRODID, COUNT(*) as likecount FROM likes GROUP BY PRODID";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
$products[$row['PRODID']]['likecount'] = $row['likecount'];
}