You could build a Data Object in Catalog that looks for these requests and then perform your actions based on what it returns. If nothing else this may give you some ideas of what tables to look at in the MDB.
Here is an example of a query that is looking for active requests, of a specific offering_id, within the last 30 days, and requested by a specific user. You could probably modify this to look for what you want. I'm pulling in request data from the associated SDM ticket because we have some values written to a ticket from our submitted form data that are not available.
SELECT DISTINCT usm_request.request_id,usm_request.status,call_req.summary,usm_request.req_by_user_id,CONVERT(varchar, usm_request.modified_date) as Modified_Date
FROM usm_request
left join usm_subscription_detail
on usm_subscription_detail.request_id = usm_request.request_id
left join [dbo].[call_req]
on [dbo].[call_req].[zcatalog_properties] = CONVERT(varchar, usm_request.request_id)
WHERE usm_request.modified_date > DATEADD(day,-30,GETDATE())
AND (usm_request.status != 103 OR usm_request.status != 4)
AND usm_request.req_by_user_id = %userid%
AND usm_subscription_detail.offering_id = '10701'
AND usm_request.created_date >= (SELECT [date_last_modified] FROM [mdb].[dbo].[usm_offering] where offering_id = '10701')
ORDER BY request_id DESC
Possibly in code behind you could do something like this where the parameters match the category you need to restrict submissions for. After the alert you could disable the submit functionality.
ca_reportQuery('YourQueryName', { 'Parameter to Search': 'Value to Search' }
function (rows) {
if (rows.length > 3) {
alert('You cannot submit this at this time.')
} else {
}
}, null);