小部件驱动的站点的数据库架构建议

lin*_*ndy 3 mysql database schema logic database-design

我目前正在重建我的网站的数据库.由于我现在的模式不是最好的模式之一,我认为听取您的一些建议会很有用.

首先,我的网站实际上包含小部件.对于每个小部件,我需要一个表settings(其中小部件的每个实例都有其用户定义的设置),一个表common(用于同一小部件​​的实例之间的共享项)和userdata(用户在小部件实例中保存的数据).

到目前为止,我有以下架构,由2个数据库组成:

  • 第一个数据库,我有所有的网站维护表(例如用户,安装的小部件,日志,通知,消息等).加上一个表,我将每个小部件实例加入到实例化的每个用户,并分配了一个唯一的ID(所以,我有以下列:user_id,widget_idunique_id).
  • 第二个数据库,我保存所有与小部件相关的数据.这意味着,每个插件(通过其独特的widget_id),我有三个表:[widget_id]_settings,[widget_id]_common[widget_id]_userdata.在每个表中,每行都保存unique_id用户窗口小部件的行.实际上,这是存储在窗口小部件中的所有用户数据.

举一个我的数据库如何工作的简短例子:

第一个数据库

  • users我的表中user_id = 1
  • widgets我的表中widget_id = 1
  • users_widgets我的表中user_id = 1, widget_id = 1, unique_id = 1

第二数据库:

  • 1_settings我有unique_id = 1, ...,其中...代表用户的小部件设置
  • 1_common我有几行代表同一小部件​​的实例之间的共享数据(所以,这里没有用户特定的数据)
  • 1_userdata我有unique_id = 1, ...,其中...代表用户的小部件数据.这里一个重要的通知是这个表可能包含几行相同的行unique_id(例如,对于任务小部件,用户可以为小部件实例创建多个任务)

希望你能粗略理解我的数据库架构.

现在,我想开发一个"更清洁"的模式,因此没有必要在我的应用程序中拥有2个数据库并每次从一个数据库切换到另一个数据库.如果我找到一种不在第二个数据库(1_settings,2_settings,...,n_settings)中动态生成表格的方法,那也会很棒.

我将非常感谢任何建议任何更好的方法来实现这一目标.非常感谢你提前!

编辑: 重构我的数据库时,我的脑海中是否有像MongoDB或CouchDB这样的数据库?我的意思是,对于第二个数据库,如果我没有固定的模式会更好.此外,传统的SQL和NoSQL如何在同一网站上相处?

Rab*_*ire 6

users_widgets表的可能模式可以是:

id | user_id | widget_id
Run Code Online (Sandbox Code Playgroud)

您不需要表中的unique_id字段users_widgets,除非您出于某种原因要隐藏主键.实际上,我会将此表重命名为更令人难忘的内容widget_instances,并widget_instance_id在第二个数据库的其余表中使用.

处理第二组表的一种方法是使用元数据样式:

widget_instance_settings

id | widget_instance_id | key | value
Run Code Online (Sandbox Code Playgroud)

这将包括userdata,因为user_id与widget_instance_id相关,除非您希望允许用户创建同一窗口小部件的多个实例,并且由于某种原因在所有实例中具有相同的数据.

widget_common_settings

id | widget_id | key | value
Run Code Online (Sandbox Code Playgroud)

这种类型的架构可以在像Elgg这样的包中看到.