我正处于对我的 Web 应用程序进行完全重新设计的开始阶段,我对一个可靠的、查询性能良好的数据库设计以及同时完全由用户自定义(用户不会自定义数据库结构,但应用程序的功能)。
所以,我的实际情况是,比如一个简单的用户表:
id | name | surname | nickname | email | phone
1 | foo | bar | foobar | foo@bar.com | 99999
就是这样。
但是,假设我的一位客户想要为一位特定用户提供 2 个电子邮件地址或电话号码。
直到现在,我过去常常通过在用户表中添加列来解决这个问题:
id | name | surname | nickname | email | phone | email_two | phone_two
1 | foo | bar | foobar | foo@bar.com | 99999 | foo@bar.net | 999998
但我不能在新应用程序的版本中使用这种方式。之后我想喝莫吉托,不喜欢客户要求编辑结构:)
所以,我想到了一个解决方案,人们可以简单地使用另一个表来定义海关字段:
id | table_refer | type_field | id_object | value
1 | users | phone | 1 | 999998
2 | users | email | 1 | foo@bar.net
保持用户表不变。
但是这种方式有两个问题:
- 据我所知,不可能以这种方式使用外键,如果我自动删除 1 个用户,外键会级联删除第二个表中具有“table_refer”值=用户和id_object=users.id。当然,我可以使用一些触发器功能,但我会失去一些可靠性。
- 当我需要查询数据库时,在检索与“foo@bar.net”匹配的用户之前,我将不得不检查所有... hem.. option_table,这将使我代码复杂且不太可靠且有许多连接困惑.. 假设用户表不会是唯一被“option_table”“扩展”的表,这似乎是一个灰色 View 。
我的目标是让我的客户根据需要为应用程序中的几乎所有对象(用户、项目、发票、打印 View 、照片、新闻等)添加尽可能多的自定义字段,假设大多数这些表的一部分将被分区(分成 2 个表,一个 3 个表和继承 gerarchy)。
您认为我的方法可以很好,您是否知道其他更好的方法,还是我犯了大错? 拜托,现在每个建议都是金子!
编辑:
我正在寻找的内容可以通过 wordpress 博客中的“文章自定义字段”得到简化。 我的目标是让用户定义他需要的新字段,例如,如果我的用户表是上面的那个,而客户需要一个我没有阻止的字段,比如网站 url,他必须能够动态添加,不编辑数据库结构,只编辑数据。
我认为 2° table(每个对象 maibe 1)可以是一个很好的解决方案,但我仍在等待更好的方法!
最佳答案
正如我在 Answer 中所说类似的问题“数据库设计很难”。您将不得不决定哪个更适合您,规范化表格并将电话号码和电子邮件地址放入他们自己的表格中,并使用关联的 JOIN 来检索数据,以及引用的额外工作完整性,或者在您的表中有一些 n 个电子邮件和电话字段,以及随之而来的“数据困惑”。
数据库设计总是一系列的权衡。您需要从各个角度进行审视,也许要制作一些原型(prototype)并进行一些分析等。没有“一个正确的答案™”。
关于php - 如何在不损失性能/良好设计的情况下构建完全可定制的应用程序(又名数据库)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951387/