2012-04-06 118 views
4

我正在建立一个包含多个表的MySQL数据库。有些表格会有相同名称的字段,但不一定用于同一目的。跨多个表的更高效的数据库结构

例如,有一个users表将包含name字段,category表和name字段等。

所以在上述例子中使用user_namecat_name

由于这些都在单独的表中我先前看到此设置了具有或不具有一个序言字段名称,是有任何好处用或不用这个前言来构建数据库?我知道使用连接并通过PHP调用数据时,您必须添加SELECT users.name AS username...以防止字段在使用mysql_fetch_array时互相覆盖。但我不确定是否有使用一种方法比其他方法更有效率?

+0

如果您使用的是支持“创建域”的数据库管理系统,那么您提出的数据管理问题的种类最好通过用户名和类别名是否应该基于同一个域来解决。 答案取决于名称为“XXX”的用户和名为“XXX”的类别是否以某种方式引用同一事物。这里的问题是语义,而不是格式。 – 2012-04-06 20:10:50

回答

0

这实在只是一个偏好问题。我个人更喜欢使用name的方法。

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

+1

你不会得到错误的数据,你会得到一个错误,名称存在于两个或更多不同的表中,这就是为什么你应该别名并明确定义你想要返回的每个字段。 – JonH 2012-04-06 19:28:35

+0

是的,当我第一次开始创建数据库时,我遇到了这个问题。它没有给出任何错误,只是当我组合表时,结果数组会覆盖'$ query ['name']'的值,并且每个变量名的实例都不会区分。 – TH1981 2012-04-06 21:02:29

1

这取决于你的店铺或你的偏好。没有任何关于使这个更好的前缀。就我个人而言,我会保留它作为名称,因为:Users.NameOrders.NameProducts.Name都包含具有不同对象类型的元组。

在一天结束时,你想保持一致。如果您更喜欢cat_user_前缀只是与您的设计一致,并包括所有对象类型的前缀。对我来说更少就是更多。

0

一个缺点是,如果任何人都足够愚蠢的使用自然联接(你可以猜测我发现这是一个糟糕的做法,但MySQL确实允许它,所以你需要考虑这是否会发生),你可能最终加入这些领域同名的意外。

+1

我同意不好的做法(在一段时间内运行的查询中)。面向向表中添加列时,自然连接和SELECT *是非确定性的。 Baaaaad。 – gahooa 2012-04-06 19:32:03