Thanks Derek, Cliff and Alec for all your help.

Web2py has become a great community.



On Mon, Oct 1, 2012 at 8:25 PM, Alec Taylor <alec.tayl...@gmail.com> wrote:
> 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()
>>> >>>>>>
>>> >>>>>>
>>> >>>>>>
>>> >>>>> --
>>> >>>>>
>>> >>>>>
>>> >>>>>
>>> >>>>
>>> >>>> --
>>> >>>>
>>> >>>>
>>> >>>>
>>> >>>
>>> >>> --
>>> >>>
>>> >>>
>>> >>>
>>> >>
>>> >> --
>>> >>
>>> >>
>>> >>
>>> >
>>> > --
>>> >
>>> >
>>> >
>>
>> --
>>
>>
>>
>
> --
>
>
>

-- 



Reply via email to