Choosing a Storage Location
If you have a scaled instance of Sitecore or if you want your instance to be extensible and scalable, then you need to avoid storing data in the master database, as CD instances wouldn't have access to it. The web database is also not an option, as you would lose the data on publish.
You basically have three options:
- Add another Sitecore database for storing your form data. This would be a database that both the CM and CD connect to, but not a publishing target.
- Add an external SQL or NoSQL database that you create yourself.
- Write custom logic to store your form data in MongoDB, which both the CM and CD connect to.
In a situation like the one you are describing, I would typically advise you to go with option 1, and use an extra Sitecore database. This will not violate your Sitecore license in any way, and will likely be the lowest effort solution. This is largely due to the amount of known structure that you have with your data, since it the results from a user poll.
Have a look at this answer to a different question on how to store user-generated content (UGC) in a Sitecore solution. In the answer, I break down the various factors that go into choosing where the data should be stored and why.
Storage Structure
Assuming you went with option 1, above, (if you didn't then that's fine - you can just translate this structure into SQL or NoSQL) then I suggest that you use the structure described below for your data.
First, you will need to create an item template to represent the user-poll that it will contain the results of. Next, you will create another item template to represent the data record from a user form submission. My recommendation would be to then have a third template to represent a form field. Based on the fields that are filled out by the user, you could programmatically add all of the fields from the submission to Sitecore, and not have to worry about carrying over changes to the form that are made later.
I recommend that you use a bucketing strategy for the records, as this will help you avoid slow-downs when querying, if your polls are to be filled out by a large number of users. You can use content search to access the results of the poll via query, and create a custom reporting tool that displays them.