|
|
|
|
stran: [1] 2 |
gregorb
član
št. sporočil: 23
|
 |
datum: 26.07.2010 | čas: 00:36 |
Pozdravljeni,
Zanima me kako mi predlagate postaviti tabelo glede na različne načine plačilnih sistemov.
Hočem vse shranjevati v eno samo tabelo.
Vendar se mi poraja kar nekaj vprašanj.
Imam plačilne sisteme:
- kreditne kartice
- moneybookers
- neteller
- paypal
Namesto, da bi ustvaru vsako tabelo posebej za plačilni sistem, je smiselno vse shranjevat v eno samo tabelo.
Uporabljam MSSQL.
Trenutno imam tabelo tbl_PaymentDetails
in uporabljam samo dva stolpca: AttributeName in Value.
Namesto, da bi ustvaril nov stolpec CreditCardNumber, itd,
vpisujem te podatke v AttributeName, v Value pa shranim vrednosti.
Ne vem kaj mi predlagate, ali, da ustvarim več stolpcev:
CardID CardType CardNumber ExpiryMonth ExpiryYear NameOnCard EmailAddress
Ali je smiselno, da imam samo AttributeName in Value.
Če ustvarim več stolpcev, kot sem navedel zgoraj, je problem, kaj shranim pod CardID, CardType in vse ostale stolpce, razen pod EmailAddress shranim podatek. Vsi ostali stolpci so prazni.
Prosim za pomoč.
Grega |
CWIZO
član
št. sporočil: 3297
|
 |
datum: 26.07.2010 | čas: 09:39 |
Povej kaj točno moraš sploh shranjevati, ni čisto razvidno iz tvojega posta.
Za key/value pa po vsej verjetnosti ne rabiš relacijske baze.
.:3delavnica.com:.
Another day, another bug |
gregorb
član
št. sporočil: 23
|
 |
datum: 26.07.2010 | čas: 10:31 |
Podatki za shranjevanje:
CardID CardType CardNumber ExpiryMonth ExpiryYear NameOnCard EmailAddress in verjetno še kaj dodatnega
Grega |
CWIZO
član
št. sporočil: 3297
|
 |
datum: 26.07.2010 | čas: 11:13 |
To nam nič ne pove.
Kakšno vrsto podatkov bi rad shranjeval? Transakcije, uporabnikove podatke o plačilnih sredstvih, ki jih ima, ... ?
.:3delavnica.com:.
Another day, another bug |
gregorb
član
št. sporočil: 23
|
 |
datum: 26.07.2010 | čas: 11:18 |
Saj sem napisal plačilne sisteme.
Samo kar je v zvezi s plačilnimi sistemi.
Samo podatke o plačilnih karticah, in e-denarnice.
To je vse.
Grega |
CWIZO
član
št. sporočil: 3297
|
 |
datum: 26.07.2010 | čas: 11:34 |
Ja različne kartice najbrž lahko združiš v eno tabelo, ker majo več ali manj vse iste podatke (ime, datum veljavnosti, varnostna koda, ...), za paypal pa moneybookers pa najbrž drugo tabelo, ker imaš najbrž druge podatke.
ps: lahko zaupaš za katero e-trgovino to gre? Oz. kako se bo imenovala ko bo izdelana.
.:3delavnica.com:.
Another day, another bug |
gregorb
član
št. sporočil: 23
|
 |
datum: 26.07.2010 | čas: 12:14 |
Gre za klasično spletno stavnico.
Ne vem eni priporočajo tako drugi tako.
Recimo, če imam stolpec AttributeName, lahko tukaj noter shranim vse podatke o plačilnih sistemih.
Ne bi rad imel 10 tabel, za 10 vrst plačilnih sistemov.
Saj to pravi marsikdo, da je nesmiselno, ker lahko vse podatke spraviš v eno tabelo
Grega |
CWIZO
član
št. sporočil: 3297
|
 |
datum: 26.07.2010 | čas: 12:27 |
Sej pravim, pogledaš skupne lastnosti različnih sistemov pa jih pogruperaš. Če maš v eni tabeli za en ali dva stolpca prazen podatke še ni tako zlo narobe. Če imaš pa tabelo z 15imi stolpci od tega za večino recordov rabiš samo 2, 3 je pa nekaj narobe v dizajnu.
.:3delavnica.com:.
Another day, another bug |
glavic
član
št. sporočil: 500
|
 |
datum: 26.07.2010 | čas: 15:40 |
čez cel array en json_encode in shrani v eno polje k naročilu.
sporočilo je spremenil glavic [26.07.2010 ob 15:40]
|
s-lime
član
št. sporočil: 814
|
 |
datum: 26.07.2010 | čas: 22:12 |
glavic, ta nasvet je pa totalno mim.
p.s.: Kratkoročno je mogoče vredu, samo čez čas bo mogče treba delat kake subquerije po tem, + maš nepotreben space overhead... Recimo ko boš rabil vse transakcije z Viso, boš rabil prebrat celo tabelo in potem filtirat s PHP, namesto da bi to prepustil algoritmom ki jih ima MySQL.
sporočilo je spremenil s-lime [26.07.2010 ob 22:20]
|
fatg
član
št. sporočil: 1695
|
 |
datum: 27.07.2010 | čas: 10:38 |
meni se ne zdi slab predlog. V posamezna polja daš razne čase, stanje plačila, znesek, tip, plačilni sistem (visa, moneta, ...), skratka vse skupne podatke, ostalo pa vržeš v json polje. Če kdaj kaj posebej potrebuješ, pa narediš skripto, ki se sprehodi po bazi, dekodira json in poišče še znotraj tega. Normalizacija baze je v nekaterih primerih overrated. :)
you\'re never too fat to do it |
glavic
član
št. sporočil: 500
|
 |
datum: 28.07.2010 | čas: 08:04 |
jaz te podatke shranjujem tako ker jih trenutno ne rabim. rabim vedeti samo ali je bilo plačano ali ne, in to je že svoje polje v tabeli. ostalo ni važno in shranim samo kot log v json array.
če bom kdaj potreboval kakšen dodaten podatek, bom naredil novo polje, in se sprehodil čez bazo in prepisal, kot je to omenil fatg.
|
s-lime
član
št. sporočil: 814
|
 |
datum: 30.07.2010 | čas: 18:08 |
Ok, fatg je predlagal kombinacijo zgornjega in tega kar je glavic predlagal, to bi mogoče bilo sprejemljivo. Ne glede na to, se to men zdi tak "dirty" način.
Če bi blo res tko da bi blo zelo malo skupnih polj, bi jaz dal dodatno tabelo ala:
id: INT
id_transakcije: INT
key: ENUM(CardID, CardType, CardNumber, ExpiryMonth);
value: varchar
Ni popolno, amapak bi šlo. Slabost je da porabiš dodatne byte za idje (pa vseeno manj kot z json_encode), pa da morejo bit vsi valui istega tipa (varchar v tem primeru), je pa boljša opcija za delat subquerije potem.
|
gregorb
član
št. sporočil: 23
|
 |
datum: 30.07.2010 | čas: 19:06 |
Torej na kratko uporabil bi eno tabelo in naredil tako:
UserId | CardId | Credit card number | Credit on name | Email
78432 3333 432784278432789 jjifdsiasjiojiod NULL
Ker želim vse plačilne sisteme shranjevati v eno tabelo, je v primeru, da je shranjena samo kreditna kartica, Polje Email NULL?
Ali je to smiselno?
Grega |
s-lime
član
št. sporočil: 814
|
 |
datum: 30.07.2010 | čas: 19:22 |
Ja zaenkrat je smiselno, zna pa se zaplesti v prihodnje, če boš hotel dodat kako novo plačilno sredstvo, ki bo imelo ena čist x polja.
|
gregorb
član
št. sporočil: 23
|
 |
datum: 30.07.2010 | čas: 19:53 |
hm imaš prav, v tem primeru se pa zna zapletat. Glede na to, da je velika verjetnost, da bom dodajal plačilne sisteme, je to izredno riskantno.
Trenutno samo za test imam takole:
UserId
CardId
AttributeName
Value
To pomeni, da v AttributeName dam ime Credit card number, credit on name, itd...
V Value pa napišem tako credit card number, credit on name...
Trenutno izgleda tako:
Attribute name | Value
Credit card num 11111111111111111
Credit on name dasjiidoaios
Paypal dioasdauios@gmail.com
Moneybookers iodasjiodioas@gmail.com
Kaj pa tak način je smiseln?
Malo problemov imam s pridobivanjem podatkov, vendar se to da uredit.
Tukaj mislim, da če dodam še 100 različnih sistemov ne bo problema, ker se tako ali tako vse zapiše v eno samo polje.
Grega |
s-lime
član
št. sporočil: 814
|
 |
datum: 30.07.2010 | čas: 22:54 |
Ne razumem te čist 100%... Če delaš tako kot jst mislim, potem se ti user_id pa card_id ponavlja. Jaz bi tako organiziral bazo:
1. tabela: USERS
id_user (PRIMARNI KLJUČ), ostalo...
2. tabela: TRANSACTIONS
id_transaction (PRIMARNI KLJUČ), id_user (TUJI KLJUČ), vrednost (+/-), nacin = ENUM(PayPal, Visa, ...)
3. tabela: TRANSACTION_DATA
id (PRIMARNI KLJUČ), id_transaction (TUJI KLJUČ), key = ENUM(CardID, CardType, CardNumber, ExpiryMonth, ...), value
V tretji tabeli mej ključ kot enume, če boš imel stringe bo lahko prišlo do napak, pa še joini bodo hitrejši.
Na tak način organiziranja baze, boš vedno lahko naredil join in potem iskal po tretji tabeli WHERE key="CardNumber" AND value="893472934", imaš pa tudi fleksibilno dodajanje parametrov.
Poljubno lahko daš skupi 2 in tretjo tabelo, sam potem se ti podvaja id_user na vsakem ključu, kar pa ni dobro. Poljubno lahko vn daš tud primarni ključ tretje tabele.
Glede na tvoje potrebe bi jaz tako naredil.
sporočilo je spremenil s-lime [30.07.2010 ob 22:57]
|
gregorb
član
št. sporočil: 23
|
 |
datum: 30.07.2010 | čas: 23:21 |
Kam pa shranim mail od paypala?
V 3 tabelo?
Če sem te razumu bi ti naredu tako:
1. tabela: USERS
UserId | FirstName
148 Gregor
904
111
2. tabela: TRANSACTIONS
UserId | PaymentMethod
148 Visa
3. tabela: TRANSACTION_DATA
UserId | AttributeName | Value
148 Credit card number 111111111111111111
148 Number on card 111111111111111111
148 Moneybookers dashdahsuid@gmail.com
148 PayPal 4324732747892@gmail.com
Pol pa če hočeš dobit podatek kličeš where UserId=148
Pa pol dodaš samo še polje CardId
Imam prav?
Potem pa moraš v četrto tabelo transactions spravit vse kar je vezano z računom.
tbl_transactions zgleda takole:
- UserId
- Transaction
- Amount
Tu pa nato določim Amount = numeric.
Povej, če imam prav, če ne me popravi.
Hvala!
Grega |
gregorb
član
št. sporočil: 23
|
 |
datum: 31.07.2010 | čas: 01:13 |
in kako boš pa v dropdownlist nafilal podatke
VISA 74326463243 5/10 ? Če uporabljaš 3 tabele kot si rekel.
Verjetno z JOIN?
ko boš utegnu povej še za prejšnji odgovor.
sporočilo je spremenil gregorb [31.07.2010 ob 01:15]
Grega |
s-lime
član
št. sporočil: 814
|
 |
datum: 31.07.2010 | čas: 11:11 |
Ne vem česa ne razumeš. Primer tabel
USERS
id, ime
1, janez
2, miha
3, kekec
TRANSACTIONS
id_transaction, id_user, vrednost, nacin
1, 1, +30 evrov, PayPal
2, 1, -15 evrov;, Visa
3, 2, 10 evrov, Mastercard
TRANSACTION_DATA
id, id_transaction, key, value
1, 1, EmailOdPayPala, fdsfs@fdfd.com
2, 1, NekiDruzgaOdPayPala, xxx
3, 2, NekiOdVise, xxx
4, 2, ŠeNEekiodVise, xxx
4, 3, NekiOdMastercarda, xxx
5, ...
...
Razumeš to? Sam da ti pač ni treba met odVise, ampak maš enostavno CardNumber, pa lahko to polje ponucaš pr vseh karticah.
V danem primeru ma janez 2 transakciji, miha eno, kekec pa nobene, vsaka transakcija ma svoj način plačila, vsak način plačila ma pa svoje parametre.
sporočilo je spremenil s-lime [31.07.2010 ob 11:13]
|
|
stran: [1] 2 |
|
|
|
stran
je še vedno v izdelavi zato nekatere stvari manjkajo
oz. niso dokončane |
|
|
|
|
| |
|