0

我有 3 张桌子:

-用户

-超级用户

-特殊用户

SpecialUser并且SuperUserUser表的扩展。假设User表有 { name, email},SuperUser有 { idUser, superPower} 并且specialUser有 { idUser, hairColor}。

当然 aSpecialUser和 aSuperUser有一个nameandemail来自用户表。这意味着 User 可以是 aSuperUser或 a SpecialUser

我的问题是如何执行获取用户所有信息的查询(在查询之前我不知道他是特殊用户还是超级用户)。

我想到了两种方法:

-在用户表中放置一列“userType”(0:他是特殊用户,1:他是超级用户)

使用这种方法,我应该在内部使用 IF 进行 MySQL 查询吗?(查询会是什么)。或者我应该做简单的查询(单独获取用户表)然后在 PHP 中我做一个 if 并查询正确的表(超级或特殊表)

或者

- 不放置任何列并在用户的 id 上使用 2 个连接执行 MySQL 查询(从技术上讲,2 个连接之一不会返回任何内容)

应该使用哪一个?(我关心的是速度性能,而不是内存——假设这些表有超过 100 万行)

4

2 回答 2

1

尽管我有一个想法,但要在没有分支的情况下做到这一点可能会很棘手;既然你说内存不是问题,但性能是。

首先在User表中创建一个列并像您建议的那样调用它userType,并将表名的内容存储在一个可解析的字符串中,然后将表列存储在一个可解析的字符串中,例如:

(SuperUser/SpecialUser), ("idUser, superPower"/"idUser, hairColor")

例子:

"SuperUser, idUser, superPower" //对于超级用户

在伪代码中:

SELECT `userType` FROM `usersTable` WHERE name = [put var here]
Let the returned value be valRet
parse the valRet into an array... //the first value is the table name, the remaining values are column names
make a second sql query based on the array

性能方面我相信这很好,因为没有分支。但是,我不确定您会对字符串解析产生什么样的性能影响。尝试在几千个查询上对其进行基准测试以查看。

//也可以在这里查看类似问题的答案: Using an IF Statement in a MySQL SELECT query

于 2013-02-10T00:56:22.663 回答
1

我将如何做到这一点是在伪 sql 中:

Select * from user
left outer join superuser
left outer join specialuser

并归还一切。如果超级用户的字段不为空,那么在 PHP 中您可以对其进行操作,对于特殊用户也是如此。这给了你两个好处:

1)你不再需要一个字段来说明用户是什么类型的用户,加入的内容会告诉你。

2) 如果您愿意,您可以让用户同时成为超级用户和特殊用户。(如果你不希望这种情况发生,你可以使用约束或类似的方法来阻止它)

于 2013-02-10T00:30:17.730 回答