Mysql 具有大量不同表的多对多关系

Mysql 具有大量不同表的多对多关系,mysql,database,doctrine-orm,Mysql,Database,Doctrine Orm,我在开发数据库模式的一部分时遇到问题。目前,我的应用程序有一个用户表和另一个事件表。我可以轻松设置多对多关系(使用第三个表)来保存关于哪些用户正在参加哪些活动的信息 我的问题是,事件只是我的应用程序的一个功能。目标是让用户可以参与大量不同的程序,每个程序都需要自己的表。然而,我仍然需要能够调用用户注册的所有内容的列表 现在,我正在考虑从每个事件表向用户建立单向关系。然后,我需要创建一个自定义函数(在我的ORM网站中),该函数独立地查询每个表并组装一个完整的列表。我觉得这样做会很慢,所以我也很乐意

我在开发数据库模式的一部分时遇到问题。目前,我的应用程序有一个用户表和另一个事件表。我可以轻松设置多对多关系(使用第三个表)来保存关于哪些用户正在参加哪些活动的信息

我的问题是,事件只是我的应用程序的一个功能。目标是让用户可以参与大量不同的程序,每个程序都需要自己的表。然而,我仍然需要能够调用用户注册的所有内容的列表

现在,我正在考虑从每个事件表向用户建立单向关系。然后,我需要创建一个自定义函数(在我的ORM网站中),该函数独立地查询每个表并组装一个完整的列表。我觉得这样做会很慢,所以我也很乐意创建一个单独的表格,列出用户注册的所有程序,并在其中存储我的应用程序运行所需的信息。这会在我的数据库中重复信息,一般来说听起来并不“干净”,但可能会更快

关于处理这种关系的最佳方式,有什么建议吗


另外,如果有必要的话,我正在使用Doctrine2和Symfony2为我的网站提供支持。

除非你有大量的事件类型,否则从几个表中查询用户注册的事件应该不会比从一个包含所有事件的长表中查询相同的事件慢多少


我将采用这种方法,每个表或集合都有一个user_id字段,该字段映射回Users表。您不需要在ORM中真正创建单独的函数。如果每个事件类型都继承自一个事件类,那么您只需按用户id查找所有事件。

这些事件类型有什么独特之处,需要它们有自己的表

如果对象本质上是不同的,请尽可能简单地使用所有事件共有的东西:

public Event
{
    public Guid Id;
    public string Title;
    public DateTime Date;
    public string Type;
    public string TypeSpecificData; // serialized JSON/XML
}

// Not derived from Event, but built from it.
public SpecialEventType
{
    public Guid Id;
    // ... and the other common props from Event

    // some kind of special prop parsed from the Event's serialized data
    public string SpecialField; 
}
然后,可以使用“特定于类型的数据”来存储关于不常见事件(通常需要列或新表)的详细信息。。。执行类似序列化XML或JSON的操作

将表MTM映射到用户表,并按基本事件属性及其类型进行查询

然后,代码负责使用数据的Type属性和与之关联的预定义XML模式解析数据

非常简单,保持数据库整洁、快速,最大限度地减少往返。这里的折衷是,您无法查询数据库中特定事件类型的细节。。。但是对于具有成熟ORM层的大规模应用程序,性能折衷是值得的


例如,现在查询一次特定类型的事件的数据,从中构建伪派生类型,然后使用LINQ“查询”它们。

在我的一个web应用程序中,我使用这种构造来存储任何以整数为主键的表的注释:

CREATE TABLE Comments (
    Table VARCHAR(24) NOT NULL,
    RowID BIGINT NOT NULL,
    Comments VARCHAR(2000) NOT NULL,
    PRIMARY KEY (TABLE, RowID, COMMENTS)
);
在我的例子中(DB2,Comments表中不到1000万行),它执行得很好。 因此,将其应用于您的案例:

CREATE TABLE Registration (
    Table VARCHAR(24) NOT NULL,
    RowID BIGINT NOT NULL,
    User <datatype> NOT NULL,
    Signup TIMESTAMP NOT NULL,
    PRIMARY KEY (TABLE, RowID, User)
);
创建表注册(
表VARCHAR(24)不为空,
RowID BIGINT不为空,
用户不为空,
注册时间戳不为空,
主键(表、行ID、用户)
);
因此,“Table”列标识包含程序的表(例如,“Events”表)RowID'是该表中的主键(例如,“事件”表中条目的主键)。为了更好地执行,这要求主键在所有目标表中具有相同的数据类型


NoSQL解决方案很酷,但上面的模式在普通的旧关系数据库中工作。

在发布时,我计划有10种不同的事件类型。随着时间的推移,我将添加更多内容。我很确定10个查询的运行速度会比1个大查询慢很多。此外,虽然它们都扩展了一个事件类,但它们都将完全独立地存储在数据库中,因此从事件类进行查询不会起作用(除非我进行自定义查询),这也不错。我的事件类型可能非常复杂。事件实际上更像是一个暗号。我认为它们是(理想情况下)完全即插即用的应用程序,用户可以将其添加到自己的帐户中,就像facebook应用程序一样。谢谢。尝试使用MongoDB(一个“无sql”文档数据库)。它适用于类似的情况,特别是如果您对JSON感到满意并且想要大规模扩展的话。我没有什么专业知识,但是很容易为它编写存储库,让你在C#domain中使用你的对象,而不是一天又一天地“架构”DB模式。我不太喜欢JSON,实际上我正在使用一个ORM,它让我可以用PHP完成所有这些。不过,不久之后我可能不得不进行一些真正的SQL查询。哦,我就是这样开始的。虽然我一直听说mongoDB,但我可能会在深入了解它之前进行研究。Mongo是必不可少的JSON数据,所以如果你讨厌它,你可能会讨厌mongoDB。您的C#库基本上将内容转储回键/值对文本中,该文本以二进制JSON格式存储在Mongo的文件数据库结构中。我有一段时间也不喜欢JSON,但后来我就投入其中,并不后悔。对于响应迅速的网络应用来说,这是很难击败的。我需要成为ale,才能与SQL中的所有数据交互,这是什么意思?也许我们明天可以开设一个聊天频道,讨论一下?我希望能够,比如说,获取所有special field=x的事件。我最终找到了自己的解决方案,包括单向关系和一个辅助表,其中包含每种类型事件的专门信息。