【问题标题】:more efficient database structure across multiple tables跨多个表的更高效的数据库结构
【发布时间】:2012-04-20 08:26:57
【问题描述】:

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

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

我之前看到过这种设置,无论是否有字段名称的前言,所以在上面的示例中使用user_namecat_name 等。

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

【问题讨论】:

  • 如果您使用的 DBMS 支持“创建域”,那么您提出的数据管理问题最好通过用户名和类别名称是否应基于同一域来解决。答案取决于名称为“XXX”的用户和名称为“XXX”的类别是否以某种方式指代同一事物。这里的问题是语义,而不是格式。

标签: php mysql database database-design


【解决方案1】:

这取决于您的商店做什么或您的偏好。没有什么前缀可以使这变得更好。就我个人而言,我会保留它的名称,因为:Users.NameOrders.NameProducts.Name 都包含具有不同对象类型的元组。

在一天结束时,您希望保持一致。如果您更喜欢 cat_user_ 前缀,请与您的设计保持一致,并为所有对象类型包含此前缀。对我来说少即是多。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你不会得到错误的数据,你会得到一个错误,即名称存在于两个或多个不同的表中,这就是为什么你应该别名并明确定义你想要返回的每个字段。跨度>
    • 是的,当我第一次开始创建数据库时,我遇到了这个问题。它没有给出任何错误,只是当我合并表时,结果数组会用该变量名的每个实例覆盖$query['name'] 值,而不是进行区分。
    【解决方案3】:

    一个缺点是如果有人愚蠢到使用自然连接(你可以猜到我发现这是一种糟糕的做法,但 mysql 确实允许这样做,所以你需要考虑是否会发生这种情况)你可能最终会加入这些字段偶然同名。

    【讨论】:

    • 我同意这种不好的做法(在将随着时间运行的查询中)。自然连接和 SELECT * 在向表中添加列时是不确定的。呸呸呸。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2013-03-09
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多