Php 跨多个表的更高效的数据库结构

Php 跨多个表的更高效的数据库结构,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我正在建立一个包含多个表的MySQL数据库。其中几个表中的字段具有相似的名称,但不一定用于相同的目的 例如,有一个用户表,其中包含一个名称字段,一个类别表中包含一个名称字段,依此类推 我以前见过这种设置,在字段名前有或没有前言,所以在上面的示例中使用user\u name,cat\u name等 由于这些都在单独的表中,有没有这个前言对构建数据库有什么好处?我知道,当使用连接并通过PHP调用数据时,您必须添加一个选择users.name作为用户名…,以防止在使用mysql\u fetch\u数组

我正在建立一个包含多个表的MySQL数据库。其中几个表中的字段具有相似的名称,但不一定用于相同的目的

例如,有一个
用户
表,其中包含一个
名称
字段,一个
类别
表中包含一个
名称
字段,依此类推

我以前见过这种设置,在字段名前有或没有前言,所以在上面的示例中使用
user\u name
cat\u name


由于这些都在单独的表中,有没有这个前言对构建数据库有什么好处?我知道,当使用连接并通过PHP调用数据时,您必须添加一个
选择users.name作为用户名…
,以防止在使用
mysql\u fetch\u数组时字段相互覆盖。但我不确定使用一种方法是否比使用另一种方法更有效?

这取决于您的商店做什么或您的偏好。前缀并不能改善这一点。就我个人而言,我会将其保留为名称,因为:
Users.name
Orders.name
Products.name
都包含具有不同对象类型的元组


在一天结束时,你要保持一致。如果您喜欢
cat_
user_
前缀,请与您的设计保持一致,并将此前缀包含在所有对象类型中。对我来说,少就是多。

这真的只是偏好的问题。我个人更喜欢只使用
名称
的方法


但有一件事需要注意,如果您正在进行任何
SELECT*FROM…
查询(您不应该这样做;总是显式选择字段),您可能最终选择了错误的数据。

一个缺点是如果有人愚蠢到使用自然连接(你可以猜到我发现这是一个糟糕的做法,但MySQL确实允许它,所以你需要考虑这是否会发生)。您可能会意外地连接到具有相同名称的字段。

如果没有得到错误的数据,您会得到一个错误,即名称存在于两个或多个不同的表中,这就是为什么您应该别名并显式定义要返回的每个字段。是的,我在第一次创建数据库时遇到了这个问题。它没有给出任何错误,just当我组合表时,结果数组将用该变量名的每个实例覆盖
$query['name']
值,而不是区分。我同意这种错误做法(在将随时间运行的查询中).Natural join和SELECT*在向表中添加列时是不确定的。baaaad。如果您使用的是支持“创建域”的DBMS,您提出的这类数据管理问题最好通过用户名和类别名称是否应基于同一个域来解决。答案取决于名为“XXX”的用户和名为“XXX”的类别是否在某种程度上指的是同一事物。这里的问题是语义,而不是格式。