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
另外,传统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
。我想知道的是如何改进此系统,从而不必使用来自