Use MySQL Workbench, throw a screenshot of your schema as an ERD on the #mysql channel on freenode.
They'll give you what you're looking for, i.e.: a rational schema. On Tue, Oct 2, 2012 at 10:08 AM, Cliff Kachinske <cjk...@gmail.com> wrote: > Read up on indexing tables. Properly indexed tables can retrieve data much > more quickly because they cut down the number of rows the dbms has to > examine. > > This is especially true across joins. MySQL does not index foreign keys so > joined queries can take a looooooooong time. > > > On Monday, October 1, 2012 9:27:42 AM UTC-4, curiouslearn wrote: >> >> Thanks Alec. I don't think I will reach those numbers, ever, for one game. >> >> This has nothing to do with web2py, but I have a MySQL database with >> about a 700,000 records and selects are quite slow in it. Some simple >> queries take 7-8 seconds per query, which is slow in the context of a >> game. Probably I have not set it up well. But that is what caused me >> to worry about this. >> >> Anyhow, thanks for the advice. >> >> >> On Mon, Oct 1, 2012 at 9:13 AM, Alec Taylor <alec.t...@gmail.com> wrote: >> > Those are really low numbers. >> > >> > When you are getting closer to a billion games a week you should >> > consider a schema change, e.g.: multi-tenant. >> > >> > On Mon, Oct 1, 2012 at 10:54 PM, Curiouslearn <curiou...@gmail.com> >> > wrote: >> >> Hi Alec, >> >> >> >> I am using mysql backend. I will most probably host it on dotcloud, >> >> using their Python and MySQL service. >> >> >> >> I think as suggested by Cliff and you, I will create only one set of >> >> tables for all games. As of now I will probably have only about 50 >> >> datapoints per team. There are no images. Right now I don't anticipate >> >> more that 20 games per 2-3 months; hence about 20000 (20 teams per >> >> game x 50 datapoints X 20 games) data points per 2-3 months. I was >> >> thinking of what would happen when more people use it. But I suppose >> >> I should not worry about that now. >> >> >> >> Thanks. >> >> >> >> >> >> On Mon, Oct 1, 2012 at 7:48 AM, Alec Taylor <alec.t...@gmail.com> >> >> wrote: >> >>> Probably not. Where are you hosting this? >> >>> >> >>> E.g.: Google App Engine doesn't have "tables", so the whole concept is >> >>> "irrelevant" there. >> >>> >> >>> Also, how much data are you talking per team, and how many teams do >> >>> you expect to be in the database? >> >>> >> >>> Unless you're storing an inordinate amount of images or realtime VOIP >> >>> recording you won't need to worry about efficiency. >> >>> >> >>> On Mon, Oct 1, 2012 at 9:21 PM, Curiouslearn <curiou...@gmail.com> >> >>> wrote: >> >>>> Hi Cliff, >> >>>> >> >>>> Thanks very much for your input. I am new to databases and appreciate >> >>>> the advice. >> >>>> >> >>>> I was also thinking of the alternative you are talking about. But >> >>>> thought that as the number of games played increased, this would >> >>>> increase the number of records in the tables and make database access >> >>>> slow. Is this not a good reason to create different set of tables for >> >>>> each game? Would appreciate any advice regarding this. >> >>>> >> >>>> Thanks. >> >>>> >> >>>> On Mon, Oct 1, 2012 at 4:46 AM, Cliff Kachinske <cjk...@gmail.com> >> >>>> wrote: >> >>>>> Do not let your tables proliferate this way. >> >>>>> >> >>>>> You need a teams table, even if it contains only the team name or >> >>>>> some other >> >>>>> identifier. >> >>>>> >> >>>>> You need a games table. >> >>>>> >> >>>>> You need to relate these two. One game has multiple teams, I >> >>>>> suppose, so >> >>>>> that makes a one-to-many relationship. >> >>>>> >> >>>>> If the same team can participate in more than one game, you need a >> >>>>> many to >> >>>>> many relationship. >> >>>>> >> >>>>> The DAL chapter in the Web2py manual explains how to implement >> >>>>> these. >> >>>>> >> >>>>> Next you add a game_id field to both your offers and decisions >> >>>>> tables. That >> >>>>> ties these events to the game. Alternatively you could simply call >> >>>>> the >> >>>>> field 'game', assuming you can remember that it contains the record >> >>>>> id of >> >>>>> the game in question. >> >>>>> >> >>>>> You also need to add a team_id field to these tables. That ties >> >>>>> each record >> >>>>> to the team involved. >> >>>>> >> >>>>> This data structure will allow you to select records for each game, >> >>>>> for each >> >>>>> team in a game. If the teams persist, you can also select all the >> >>>>> records >> >>>>> related to the team. >> >>>>> >> >>>>> On Sunday, September 30, 2012 5:31:50 PM UTC-4, curiouslearn wrote: >> >>>>>> >> >>>>>> Hello, >> >>>>>> >> >>>>>> This is a question about recommended practice for doing the >> >>>>>> following: >> >>>>>> >> >>>>>> I want to create a web interface for creating a setup for new >> >>>>>> games. For >> >>>>>> example, the web interface will let me specify >> >>>>>> name of the game, number of teams etc. Based on this information I >> >>>>>> want to >> >>>>>> create new database tables for the game. >> >>>>>> Should the table definitions be given in a controller function, >> >>>>>> such as in >> >>>>>> the example below? Is that the recommended way >> >>>>>> to do this, or is there another way that you would recommend. >> >>>>>> >> >>>>>> Thank you. >> >>>>>> >> >>>>>> **Controller function for creating tables** >> >>>>>> >> >>>>>> def createtables(): >> >>>>>> if request.post_vars: >> >>>>>> experimentname = request.post_vars.experimentname >> >>>>>> numteams = int(float(request.post_vars.numteams)) >> >>>>>> teams_tablename = "{0}_teams".format(experimentname) >> >>>>>> offers_tablename = "{0}_offers".format(experimentname) >> >>>>>> ardecisions_tablename = >> >>>>>> "{0}_ardecisions".format(experimentname) >> >>>>>> migrate_teamstablename = >> >>>>>> "{0}.table".format(teams_tablename) >> >>>>>> migrate_offerstablename = >> >>>>>> "{0}.table".format(offers_tablename) >> >>>>>> migrate_ardecisionstablename = >> >>>>>> "{0}.table".format(ardecisions_tablename) >> >>>>>> db.define_table(teams_tablename, >> >>>>>> Field('teamname', 'string', length=40, >> >>>>>> required=True, >> >>>>>> unique=True, notnull=True), >> >>>>>> Field('passwd', 'password'), >> >>>>>> Field('role', 'string', length=20, required=True, >> >>>>>> default='NA'), >> >>>>>> format = '%(teamname)s', >> >>>>>> migrate=migrate_teamstablename) >> >>>>>> # Table showing the ask amount of the first mover >> >>>>>> referencestring = 'reference {0}'.format(teams_tablename) >> >>>>>> db.define_table(offers_tablename, >> >>>>>> Field('round', 'integer'), >> >>>>>> Field('askamount', 'integer'), >> >>>>>> Field('payoff', 'integer'), >> >>>>>> Field('teamname_id', referencestring), >> >>>>>> migrate = migrate_offerstablename) >> >>>>>> >> >>>>>> >> >>>>>> # Table accept-reject decisions >> >>>>>> db.define_table(ardecisions_tablename, >> >>>>>> Field('round', 'integer'), >> >>>>>> Field('acceptorreject', 'string', >> >>>>>> length=2), >> >>>>>> Field('payoff', 'integer'), >> >>>>>> Field('teamname_id', referencestring), >> >>>>>> Field('offerer_id', referencestring), >> >>>>>> migrate = migrate_ardecisionstablename) >> >>>>>> >> >>>>>> >> >>>>>> teamnames = maketeamnames(numteams) >> >>>>>> for tname in teamnames: >> >>>>>> db[teams_tablename].update_or_insert(teamname=tname) >> >>>>>> db.experimentlist.insert(experimentname=experimentname) >> >>>>>> return dict() >> >>>>>> >> >>>>>> >> >>>>>> >> >>>>> -- >> >>>>> >> >>>>> >> >>>>> >> >>>> >> >>>> -- >> >>>> >> >>>> >> >>>> >> >>> >> >>> -- >> >>> >> >>> >> >>> >> >> >> >> -- >> >> >> >> >> >> >> > >> > -- >> > >> > >> > > > -- > > > --