Hi,

please don't hijack threads, post new ones if you have a new topic.

Comments see below.

I have a new internal app to build starting June 1 with Beta Sept 1 and
production deploy Oct 1.  I'm an old hand at Python and MySQL with a
little TG 1.0.4 and SQLObject but no SQLAlchemy.

I'm planning to use Flex for the UI and have TG pass it XML.  I've
already got the Flex completed.

Worst case scenario is 100 simultaneous users organized into 20
autonomous divisions and no one making rapid changes.  I'll be using
CentOS and MySQL 5.0 on virtual servers with as much RAM as I need.
Performance is not an issue.

Each logical record contains about 500 fields which may be cleanly
grouped into about 20 sections. Not all fields apply to all records and
this is determined from a template when the record is created.  The
Create, Copy, Delete, Validate and Print functions will need access to
all 500 fields while Edit will address one 1 section at a time.  One
geographical region (state) as a supplement section "S" with about 5
fields; however due to schedule constraints I could incorporate it into
the generic DB and just put NULL's in its values for the other regions
so it could be ignored.  Not pretty but this is a stop-gap task.

None of this is related to TG1 or TG2, so it's up to you what weapon you chose.

I personally wouldn't go for the 500 column row, for a range of reasons:

 - no not-null constraints
 - a beast to work with in any SQL-related tool
- also a massive monster of a declaration in SQLAlchemy (unless you reflect of course) - no domain/subclass specific model code, one of the advantages of ORMs

So depending on your actual requirement, I would implement this as either a core table with a lot of sub-tables that relate to it and make the whole thing an aggregation, or if things are compatible withe a single-inheritance-model, use inheritance. My gut feeling says me though that's not really an option.



It would be "nice" to prevent simultaneous edits of the same section in
the same record, but the schedule constraints would allow me to ignore
that issue and just tell users "don't do that" (yes that's operationally
feasible)

Don't deal with conflicts. First, don't care at all. If the really create problems, go for an optimistic locking strategy, potintially with somo ajaxy (or whatever the equivalent in flex is) status-polling that tells a user that the record she works on was modified in the meantime.

After all, if these things are really a problem, it's much more an organizational matter than a technical. Why are people working together on the same thing at the same time, does it make sense to split out certain data again into subsets and so forth...


I am hoping to avoid any major design mistakes that could require
significant rework, so my questions are:

1. Are there any features that would cause me to choose TG 2.1 over 2.0
other than the release status of 2.1?  Especially given that I'm using
Flex and not Genshi.

I'd say stick with TG2.0, but I'm not totally up to date with the latest and greatest in TG21, others might have different opinion here.


2. Will I encounter documentation "shortfalls" with 2.1 compared to 2.0.

No idea, I almost always only read code :)

3. Should I use one huge (500 column) MySQL table and then define models for editing the different sections to minimize joins or should I map the
sections to tables to make it more modular?

See above.

3.a. I can use one table with 500 columns and then use MySQL "INSERT
INTO active SELECT * from template where datatype=3" type of syntax to
create a new record with the appropriate NULL's for the non-applicable
fields.  A Copy function will have to examine the NULL's in the record
introduced by the template, so each field must be examined individually.

3.b. Are there any SQLAlchemy issues with large tables?

I don't think so.


3.c. Is there a Pythonic way to copy all the fields from a template into
a record in SQLAlchemy without iterating through all the fields?

Not sure what you mean, this depends massively on what you consider a template, how it's implemented and so forth. I'd say given the dynamic natuer of python, you should be able to come up with a declarativ enough solution.

Diez

--
You received this message because you are subscribed to the Google Groups 
"TurboGears" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/turbogears?hl=en.

Reply via email to