Mysql 小部件驱动站点的数据库模式建议

Mysql 小部件驱动站点的数据库模式建议,mysql,database,database-design,schema,logic,Mysql,Database,Database Design,Schema,Logic,我目前正在重建我的网站的数据库。由于我现在的模式不是最好的模式之一,我认为听取您的一些建议会很有用 首先,我的站点实际上由小部件组成。对于每个小部件,我需要一个用于设置(小部件的每个实例都有其用户定义的设置)的表,一个用于公共(同一小部件实例之间的共享项)和用户数据(小部件实例中用户保存的数据)的表 到目前为止,我有以下模式,由2个数据库组成: 第一个数据库,其中我有所有站点维护表(例如,用户、安装的小部件、日志、通知、消息等),还有一个表,在该表中,我将每个小部件实例连接到每个实例化的用户,

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

首先,我的站点实际上由小部件组成。对于每个小部件,我需要一个用于
设置
(小部件的每个实例都有其用户定义的设置)的表,一个用于
公共
(同一小部件实例之间的共享项)和
用户数据
(小部件实例中用户保存的数据)的表

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

  • 第一个数据库,其中我有所有站点维护表(例如,用户、安装的小部件、日志、通知、消息等),还有一个表,在该表中,我将每个小部件实例连接到每个实例化的用户,并分配了唯一的ID(因此,我有以下列:
    user\u id
    widget\u id
    unique\u id
  • 第二个数据库,我保存了所有与小部件相关的数据。这意味着,对于每个小部件(通过其
    小部件id
    )我有三个表:
    [widget\u id]\u settings
    [widget\u id]\u common
    [widget\u id]_userdata
    。在这些表中,每一行都保存着用户小部件的
    唯一id
    。实际上,这是存储在小部件中的所有用户数据
请给出我的数据库如何工作的简短示例:

第一个数据库:

  • users
    表中,我有
    user\u id=1
  • widgets
    表中,我有
    widget\u id=1
  • users\u widgets
    表中,我有
    user\u id=1,widget\u id=1,unique\u id=1
第二个数据库:

  • 1_设置
    中,我有
    unique_id=1,…
    ,其中…表示用户的小部件设置
  • 1_common
    中,我有几行表示同一小部件实例之间的共享数据(因此,这里没有特定于用户的数据)
  • 1_userdata
    中,我有
    unique_id=1,…
    ,其中…表示用户的小部件数据。这里的一个重要注意事项是,此表可能包含多个具有相同
    unique_id
    的行(例如,对于任务小部件,用户可以对小部件实例执行多个任务)
希望您能大致了解我的数据库模式

现在,我想开发一个“更干净”的模式,这样就不需要在我的应用程序中有两个数据库,每次都从一个数据库切换到另一个数据库。如果我能找到一种不在第二个数据库(1_设置、2_设置、…、n_设置)中以友好方式生成表的方法,那也将非常好

我将非常感谢为实现这一目标而提出的任何更好的建议。提前非常感谢

编辑: 当我重组数据库时,我的脑海中应该有MongoDB或CouchDB这样的数据库吗?我的意思是,对于第二个数据库,如果没有固定的模式会更好。
另外,传统SQL和NoSQL在同一个站点上如何相处?

您知道小部件类和小部件实例可能具有的设置吗?在这种情况下,这些设置可以由小部件类表(用于公共设置)和小部件实例(用于实例特定设置)的列组成。

如果您不知道它们,那么您可以有一个小部件类设置表,它与小部件类表有多对一关系,小部件实例设置与小部件实例表有多对一关系。在小部件实例和小部件类之间,您也可以有多对一关系。小部件实例可以在users表中还有一个外键,这样您就可以知道是哪个用户创建了一个特定的小部件。

users\u widgets表的可能模式可以是:

id | user_id | widget_id
除非出于某种原因想隐藏主键,否则您不需要
users\u widgets
表中的
unique\u id
字段。事实上,我会将此表重命名为更容易记住的名称,如
widget\u instances
,并在第二个数据库的其余表中使用
widget\u instance\u id

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

小部件\u实例\u设置

id | widget_instance_id | key | value
id | widget_id | key | value
这将包括userdata,因为user_id与widget_instance_id相关,除非您希望允许用户创建同一widget的多个实例,并且由于某种原因在所有实例中具有相同的数据

小部件\u常用\u设置

id | widget_instance_id | key | value
id | widget_id | key | value

这种模式可以在包中看到,比如。

你把表格弄混了一点,也许我的解释不太清楚。用户可以创建一个小部件(并上传到我的网站上)一个用户可以使用一个小部件。这是两个不同的故事。我对第一个没有问题,只对第二个有问题。当安装一个新的小部件时,在第二个数据库中创建了3个不同的表(这就是现在发生的情况)。这3个表中的每一个都有一个预定义的模式,以满足小部件的需要(任务小部件需要
task\u name
列,notes小部件需要
note\u content
列)。因此,所有列都是预定义的。现在,当用户开始使用小部件时,我们在第一个数据库的
users\u小部件
表中添加一个新行,其中包含一个
唯一的\u id
。然后,我们在
第二个数据库中的[widget\u id]\u settings
,使用该
唯一的\u id
。settings行是必需的;每个widget实例都必须在settings表中注册。当用户添加某些内容(例如任务)时,我们在
中创建[widget\u id]_userdata
一行,也使用任务的
唯一\u id
。我想知道的是如何改进此系统,从而不必使用来自