I don't know of any better tool for designing a database than good old pen and paper (or pencil and paper if you think you'll make mistakes 😉 ).
I know Microsoft makes a workflow tool that can be used for databases, and some database management tools come with a UML designer. But really all you need is a good UML tool. Eclipse has a plugin (or a couple) but they may be proprietary (i.e. $$). So like I said, pencil and paper 😉
All you need to do is sit down and think logically about how it will work. You know you'll have users and user information, and you'll have schedules for each user. You know each user is a part of a team, and that team works the same schedules (with minor exceptions).
Well right off the bat I see 3 tables (users, teams, schedules). I would set them up something like this:
+-------------------------+ +-------------------+
| Users | | Teams |
+-------------------------+ +-------------------+
| <> id (int) |--+ +-->| <> id (int) |
| username (varchar) | | | | name (varchar) |
| password (varchar) | | | +-------------------+
| first_name (varchar) | | |
| last_name (varchar) | | +---------------------------------+
| email (varchar) | | |
| created (timestamp) | | +-------------------------+ |
| modified (timestamp) | | | Teams_Users | |
+-------------------------+ | +-------------------------+ |
| | <> id (int) | |
| | [] team_id (int) |---+
+------------>| [] user_id (int) |
| starting (timestamp) |
| ending (timestamp) |
+-------------------------+
Now you can visually see how users and teams match up. Adding schedules in there is as easy as:
+-------------------------+ +-------------------+ +------------------+ +-----------------+
| Users | | Teams | | Schedules | | Times |
+-------------------------+ +-------------------+ +------------------+ +-----------------+
| <> id (int) |--+ +-->| <> id (int) |--------+ +-->| <> id (int) | +---->| <> id (int) |
| username (varchar) | | | | name (varchar) | \ | | [] time_id (int) |-----+ | day (enum) |
| password (varchar) | | | +-------------------+ \ \ +------------------+ | start (time) |
| first_name (varchar) | | | \ \ | end (time) |
| last_name (varchar) | | +---------------------------------+ \ \ +-----------------+
| email (varchar) | | | | \
| created (timestamp) | | +-------------------------+ | | +--------------------------+
| modified (timestamp) | | | Teams_Users | | | |
+-------------------------+ | +-------------------------+ | | +----------------------+ |
| | <> id (int) | | | | Schedules_Teams | |
| | [] team_id (int) |---+ | +----------------------+ |
+------------>| [] user_id (int) | | | <> id (int) |<--+
| starting (timestamp) | | | [] schedule_id (int) |
| ending (timestamp) | +-->| [] team_id (int) |
+-------------------------+ +----------------------+
Now you have a modular way to connect schedules to teams and users to teams. You can even be extremely finite down to days and times.
Now every user belongs to a team and each team has a schedule. Each schedule has many days. When a user wishes to modify their time, you need another table: users_times 😉 A user will create a new time that will be linked back via that join table users_times. So if they wanted to modify all Wednesdays they could do so, and not impact the global schedule for their team. You would only have to modify one row to do so. Or you could create a second table that mimicks the times table and call it custom times (or something) and store with it if it is repetitive or just a single occurance on a single date.
I don't know of any tutorials for this type of stuff, but I've given you my general thought process. I'm sure some other developers will think of other ways (some better, some worse) to tackle this issue. I'm a fan of keeping things clean and precise and not actually deleting data (but rather archiving it for records).
Hope that helps you out.
I'm also moving this to the Database forum as it seems it would fit better (and get more appropriate replies) there.