数据库设计 - 使用关系避免问题时的最佳实践?

时间:2017-06-21 18:48:16

标签: mysql database oracle database-design relational-database

我正在写这条消息,就“如何设计我的数据库”提出建议。

我不是开发人员,只是拥有一些基本知识来编写我自己的网站,并设计一些非常基本的DRM。

我的“问题”如下:

我通常根据相同的基本原则(不使用外键)创建我的表(无论我使用的数据库,MySQL,Oracle等),最后,我的程序总是有大量查询,我称之为“软”关系(如教程中所见..),例如:

select
 a.field1
 a.field2
 b.field3
 c.field4
 d.field5
 d.field16
 x.fieldN
from
 table1 a,
 table2 b,
 table3 c,
 table4 d,
 tableN x
where
 table1.id = table2.user_id
 and table1.thingid = table3.thing_id
 and table1.group_id = table3.group_id
 and table2.id = table4.id
 and so.on
 and so.on
 and so.on
 and so.on
 and so.on

问题是多方面的:

  1. 我有很多疑问,大量关系使用点,难以管理和阅读
  2. 维持
  3. 很痛苦
  4. 如果我更改任何列名或字段名称,我必须调整我的代码
  5. 删除一些数据搞砸关系(我知道我必须使用约束来避免这种情况)
  6. 所以我的问题是:

    1. 这样做是最佳做法吗?
    2. 我应该使用外键吗?什么是最好的方法呢?
    3. 我应该使用任何其他方法吗?和/或你知道我可以买的任何好书来学习这些“数据库设计最佳实践”。
    4. 谢谢你 问候

      PS:另一个快速的问题,在编码时,我应该将查询保留在PHP页面本身中,还是将查询通过将它们全部放在配置文件中来隔离查询是最佳做法?谢谢 ! (我正在使用PHP)

1 个答案:

答案 0 :(得分:1)

(在MySQL中......)

"大量加入"将工作(最多61个),但它是一个糟糕的架构设计的症状。除了EAV架构(这是有问题的)之外,很少看到超过4个表加入。

FOREIGN KEY生成INDEX。执行INDEX需要JOIN。如果没有索引,则需要完全扫描第二个表(无论哪个表);使用合适的索引,查找是“立即”。

有时大量的联接来自初学者"过度正常化"。

您是否愿意进一步描述您的应用程序和架构;然后我们可以通过示例教学而不是手工挥动。