Uit Hack42
Waar moet de database aan voldoen
- webbased editen. Dit is een wens/eis voor de frontend applicatie
- text based editen (evt. lynx) idem
- beperkt publiek toegankelijk via andere url idem
Eisen
- Intern volledig UTF-8
- Minimaal in 3NF uitgenormaliseerd
- Uniforme en consequente taal/woordkeuze in alle DDL
- Leesbare DDL (geen afko's etc)
- Gebruik van commentaar in DDL (taal tevens identiek aan taalkeuze DDL)
- Correct gebruik van de beschikbare datatypen
- Ik zat zelf aan een schemaloze database te denken (MongoDB of zo). Een paar verplichte velden en de rest min of meer vrij. Omdat er anders voor elk apparaatsoort een andere tabel moet komen, er moeilijke meta-databases gemaakt moeten worden met key/value tabellen en zo (denz (overleg) 23 aug 2014 12:41 (CEST))
Wensen
- Logging van wijzigingen op objecten (records); Wie, Wat, Wanneer, (Waarom?)
Beslissingen
- Eventueel geschikt te maken voor teksten in meerdere talen?
- Documentstorage: in de database?
- Database kan heel snel heel groot en log worden
- Records altijd up-to-date en compleet
- Consistente backups en eenvoudigere replicatie
- Documentstorage: buiten de database?
- Directorypaden of URL's in de database kunnen extern wijzigen, documenten kunnen verdwijnen of corrupt raken
- Database blijft klein, dus snel
- Schema/DDL op Github (oid)?
Wat voor soorten objecten hebben we?
- systemen - iets met een soort van CPU en memory, waar een OS op draait
- "universele" - OS wordt extern geladen, aanpasbaar met uitbreidingskaarten, etc.
- "dedicated" - OS in firmware, single task (rekenmachines e.d.)
- peripherals - in/uitvoer voor bovenstaand
- invoer (keyboards, tablets, muizen, trackballs, kaartlezers, barcode scanners etc.)
- uitvoer (printers, plotters, kaartponsers, monitoren)
- combinatie van bovenstaande 2 (terminal, kaartlezer+ponser, etc.)
- opslag (harddisks, floppies, bernoully, MO, magtape, paper tape, etc.)
- netwerk (switches, hubs, media converters, transceivers, routers, terminal servers, etc.)
- andere comms (modems, acoustic couplers, current loop converters, etc.)
- specials
- (electro)mechanische reken- en typmachines
- discrete elektronica
- purpose-built spul (testapparatuur, etc.)
- media
- documentatie
- algemeen
- specifiek (install/user/sys.mgmgt/prog/service manuals)
Wat moeten we per object opslaan? (n.b. dit zal varieren per soort object)
Algemeen
- modelspecifiek:
- "Meer info" (externe links)
- Knowhow
- exemplaarspecifiek
- uniek catalogusnummer met QR/barcode
- bijzonderheden
- herkomst
- datum binnenkomst
- Foto's (of link naar gallery/mediawiki)
- Edited by
Voor hardware
Structuur:
- fabrikant
- model 1
- exemplaar 1
- exemplaar 2
- ...
- model 2
- exemplaar 1
- ...
- ...
- model 1
- ...
- algemeen: fabrikant, model, algemene specs (architectuur e.d.), productieperiode
- specifiek: configuratie/variant, serienummer, productiedatum, andere kenmerken, "hoort bij", status
Voor media
Structuur:
- fabrikant/leverancier
- pakket 1
- pakket 2
- ...
- ...
Een extra relationele laag lijkt me hier niet nodig omdat we waarschijnlijk zelden meerdere exemplaren van hetzelfde pakket zullen hebben, en hetzelfde pakket op verschillende media verschillende SKUs zal hebben.
- pakket, SKU, versie, mediatype, "hoort bij", kopie/image gemaakt + naam + datum
- voor OSen: target systeem/config/specs
- voor applicaties: target OS, requirements, restricties.
Voor documentatie
- leverancier/uitgever, auteur, titel, ISBN/SKU, datum
- specifieke docs: "hoort bij", versie, gescanned + filenaam + datum
overpeinzing
- hoe om te gaan met itemX onder verkoopnaam Y
- lijkt me niet zo moeilijk. "Model" heeft altijd een modelnaam/nummer (bijv. VX40B-F2); verkoopnaam (DEC Multia Alpha) is optioneel. Alleen onze pedantic mediawiki valt op een rare manier over een lege naam (indien leeg wordt 'rubriek' genegeerd, en komt het systeem dus niet in Museum). Voor $whateverSQL moet dat geen probleem zijn. Wikilink wordt fabrikant + verkoopnaam, of fabrikant + modelnummer indien verkoopnaam leeg.
DDL
CREATE TABLE fabrikant ( naam varchar(80), logo varchar(80), -- link naar image op wiki artikel varchar(80), -- link naar artikel op wiki fab_id serial ); CREATE TABLE contact ( -- identiek voor museummedewerkers, eigenaars en herkomst contact_id serial, contact_name varchar(80), contact_adress varchar(80), contact_city varchar(80), contact_country varchar(80), contact_tel varchar(20), contact_email varchar(80), contact_link varchar(80), contact_comment varchar(100), -- wil wel/niet op de hoogte gehouden worden/ wel/niet contact mee opnemen.etc. showcontact boolean, is_medewerker boolean, is_owner boolean, is_herkomst boolean ); CREATE TYPE category AS ENUM ('systeem', 'peripheral', 'storage', 'network', 'comms', 'misc', 'part'); CREATE TABLE hw_model ( fab_mod_id serial, fab_id int, modelname varchar(80), commercname varchar(80), fab_mod_id serial, hw_category category, prod_start date, prod_end date, knowhow int[], -- lijst van contact_IDs ... ); CREATE TYPE sys_type AS ENUM ('computer', 'desktop computer', 'handheld', 'home computer', 'laptop', 'minicomputer', 'portable computer', 'server', 'werkstation'); CREATE TABLE hw_model_system ( -- per-model data voor systemen fab_mod_id int, model_sys_type sys_type, model_cpu_architecture varchar(20), -- x86, 68k, AXP, Sparc, Power, MIPS ... model_cpu_generation varchar(20), -- PIII, EV5 ... model_bus varchar(20), model_possible_os varchar(80), -- welk OS kan op deze machine draaien ... model_more_info text -- links naar meer info, docs, etc. ); CREATE TYPE HMIperipheral_category AS ENUM ("input", "output", "in/out"); CREATE TYPE HMIperipheral_type AS ENUM ("keyboard", "muis", "tablet", "trackball", "monitor", "terminal", "printer", "overig"); // misschien maakt een ENUM het HMIperipheral_type te beperkt, aan de andere kant wil je een beetje uniformiteit in je types hebben. CREATE TABLE hw_model_HMIperipheral ( -- per-model data voor peripherals fab_mod_id int, model_peri_category HMIperipheral_category, model_peri_type HMIperipheral_type, model_connection varchar(20), -- type connectie naar systeem model_tied_to_system varchar(80), -- "hoort bij" ... model_more_info text -- links naar meer info, docs, etc. ); CREATE TABLE hw_model_storage ( -- per-model data voor storage fab_mod_id int, model_stor_type varchar(20), -- FD/HD/tape/removable/MO/Bernoully/ponsband/ponskaart/etc... model_connection varchar(20), -- type connectie naar systeem model_tied_to_system varchar(80), -- "hoort bij" ... model_more_info text -- links naar meer info, docs, etc. ); CREATE TABLE hw_item_system ( -- per-item data voor systemen invent_id serial, fab_mod_id int, item_serial varchar(40), item_config varchar(20), -- config variant (optioneel) item_hw_list text, item_os varchar(20), item_os_version varchar(20), item_has_IP_network boolean, item_has_other_network boolean, item_network_MAC macaddr[], item_network_IP inet[]; item_network_other text, -- andere netwerkprotocollen + adressen item_prod_date date, -- produktiedatum item_in_date date, -- datum invoer item_herkomst int, item_owner int, item_status varchar(20)[], -- array met status item_status_date date[], -- array van data waarop status gewijzigd is item_status_user int[], -- array met wie status gewijzigd heeft item_pics varchar(80), -- link naar (folder met) foto's item_article text, -- of link naar wikipagina?? item_comment text, -- gebruiksvoorwaarden zoals bruikleen, wel/niet repareren. etc. ... ); CREATE TABLE hw_item_HMIperipheral ( -- per-item data voor peripherals fab_mod_id int, invent_id serial, item_serial varchar(20), item_prod_date date, item_herkomst int, item_owner int, item_in_date date, item_fw_vers varchar(20), item_status varchar(20)[], -- array met status item_status_date date[], -- array van data waarop status gewijzigd is item_status_user int[], -- array met wie status gewijzigd heeft item_pics varchar(80), -- link naar (folder met) foto's item_article text, -- of link naar wikipagina?? item_comment text, -- gebruiksvoorwaarden zoals bruikleen, wel/niet repareren. etc. ... ); CREATE TABLE hw_item_storage ( -- per-item data voor storage fab_mod_id int, invent_id serial, item_serial varchar(20), item_prod_date date, item_herkomst int, item_owner int, item_in_date date, item_fw_vers varchar(20), item_status varchar(20)[], -- array met status item_status_date date[], -- array van data waarop status gewijzigd is item_status_user int[], -- array met wie status gewijzigd heeft item_pics varchar(80), -- link naar (folder met) foto's item_article text, -- of link naar wikipagina?? item_comment text, -- gebruiksvoorwaarden zoals bruikleen, wel/niet repareren. etc. ... ); CREATE TABLE media_item ( ); CREATE TABLE doc_item ( );