php - 如何在不损失性能/良好设计的情况下构建完全可定制的应用程序(又名数据库)?

标签 php python performance database-design postgresql

我正处于对我的 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. 据我所知,不可能以这种方式使用外键,如果我自动删除 1 个用户,外键会级联删除第二个表中具有“table_refer”值=用户和id_object=users.id。当然,我可以使用一些触发器功能,但我会失去一些可靠性。
  2. 当我需要查询数据库时,在检索与“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/

相关文章:

php - 将最后一次 mysql 查询的信息保存到历史表中

php - 仅使用 Sphinx 搜索引擎 (API-PHP) 进行通配符匹配和邻近度精确匹配

python - 如何在Python中列出数组中大于特定值的所有值

python - 似乎无法打印出 "round 1. rounds 2, ext"

performance - 系数函数速度慢

php - 使用空间分析功能和数据类型在 MySQL 中按距离排序

javascript - fatal error : Array and string offset access syntax with curly braces is no longer supported in php 8. 0 pkcs5_unpad

MySQL - 'Using index condition' 与 'Using where; Using index'

jquery - 用于与 jsonp 通信的简单 Python HTTP 服务器

c# - 维护排序顺序的集合 C#