Avatar billede Calle5463 Forsker
09. december 2016 - 18:42 Der er 7 kommentarer og
1 løsning

Navngivning af felter

Hvordan navngiver i jeres felter i tabeller - jeg tænker spec. på "id" (tror jeg er løet lidt sur i navnene i et php-script)?

medlemsdata: id (+ fx f_navn, adr1)
item: id (+ fx itemnavn, pris)
link-tabel: id, medlems_id, item_id

eller

medlemsdata: medlems_ID (+ fx f_navn, adr1)
item: item_ID (+ fx itemnavn, pris)
link: link_ID, medlems_id, item_id

eller noget andet?
Avatar billede Slater Ekspert
09. december 2016 - 18:54 #1
Nogle mennesker kan godt lide at navngive det med tabellens navn også. Jeg har altid synes det var meningsløst, og kun gør ens queries mere komplicerede. I enhver situation hvor der er mere en én tabel, det kan tilhøre, vil du alligevel referere til id'et som tabelnavn.id - ikke bare som id - så der er ingen mulighed for misforståelse.

Jeg ville altså bare kalde kolonnerne ting som id, name, price, address, osv. Det eneste lidt specielle sted, er med relationer og foreign keys. Hvis en kolonne peger på id'et i en anden tabel, bruger jeg tabelnavnet.

Har du f.eks. tabellen users og hver user kan have x antal biler i tabellen cars, så kalder jeg kolonnen i cars der refererer til users.id for cars.users_id.
Avatar billede arne_v Ekspert
09. december 2016 - 18:56 #2
Det er nok de to mest oplagte.

Jeg mener at den anden er bedst, men maa tilstaa at hvis jeg har lidt travlt saa ender det tit med den foerste.

Nu om dage bruger jeg normalt:
-  udelukkende store bogstaver til SQL keywords, functions, types etc.
- udelukkende smaa bogstaver til mine navne

Og undgaa navne som er keywords eller er keywords i en anden database.
Avatar billede Calle5463 Forsker
09. december 2016 - 19:02 #3
Det er dette lille program som driller mig, og det er muligvis noget helt andet end navnene:


<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Testing</title>
        <style type="text/css">
        </style>
        <script type="text/javascript">
        </script>
    </head>
<body>



<?php
require_once("toolbox/connect_to_db.php");

$con = forbind_til_database();

    $sql = "SELECT
                cer_aftaler.id,
                cer_aftaler.medlems_id,
                cer_aftaler.hovedgruppe_id,
                cer_aftaler.itemgruppe_id,
                cer_aftaler.item_id,

                cer_medlemsdata.id,
                cer_medlemsdata.f_name,
                cer_medlemsdata.l_name,

                cer_itemgrupper.id,
                cer_itemgrupper.itemgruppe,

                cer_hovedgrupper.id,
                cer_hovedgrupper.hovedgruppe,

                cer_item.id,
                cer_item.itemname
            FROM
                cer_medlemsdata

                LEFT JOIN cer_aftaler ON cer_aftaler.medlems_id = cer_medlemsdata.id
                LEFT JOIN cer_hovedgrupper ON cer_hovedgrupper.id = cer_aftaler.hovedgruppe_id
                LEFT JOIN cer_itemgrupper ON cer_itemgrupper.id = cer_aftaler.itemgruppe_id
                LEFT JOIN cer_item ON cer_item.id = cer_aftaler.item_id

            WHERE
                cer_medlemsdata.id = '2' ";                    //    ved manuelt opslag i tabellen findes to aftaler, og der udskrives også to linier

    $res = $con->query($sql);
   
    if ($res->num_rows > 0) {
        echo "<table border='2'>" .
            "<tr><th>Medlems-id</th><th>Aftale-id</th></tr>";
                       
        while($row = $res->fetch_array()) {
           
            echo "<tr><td align='center'>" . $row['medlems_id'] . "</td><td align='center'>" . $row['cer_aftaler.id'] . "</td></tr>";
        }
        echo "</table>";
    } else {
        echo "<strong>Damn, der er ingenting at vise!!!</strong><br>";
    }
?>

</body>
</html>


Resultat - ved manuelt opslag i tabellen findes to aftaler, og der udskrives også to:

Notice: Undefined index: cer_aftaler.id in F:\xampp\........\testing.php on line 58

Notice: Undefined index: cer_aftaler.id in F:\xampp\..........\testing.php on line 58
Medlems-id    Aftale-id
2   
2   


Linie 58

echo "<tr><td align='center'>" . $row['medlems_id'] . "</td><td align='center'>" . $row['cer_aftaler.id'] . "</td></tr>";
Avatar billede arne_v Ekspert
09. december 2016 - 19:14 #4
proev:

SELECT
                cer_aftaler.id AS cer_aftaler_id,
                cer_aftaler.medlems_id,

og:

$row['cer_aftaler_id']
Avatar billede Calle5463 Forsker
09. december 2016 - 19:26 #5
Bingo, Arne.

Men det får mig stadig til at overveje, hvorvidt jeg een gang for alle skal sørge for sikker navngivning af id-felter

Jeg har for nylig set, at det ikke længere er comme il faut at bruge * efter SELECT. Er det en skrøne eller ....?
Avatar billede arne_v Ekspert
09. december 2016 - 19:27 #6
Pussigt nok illustrerer det det hvorfor jeg mener at den anden form er bedst. Men unikke feltnavne kan man undgaa tabel navne og AS.
Avatar billede arne_v Ekspert
09. december 2016 - 19:30 #7
Jeg er ioevrigt ikke tilhaenger af navne prefix som i dit tilfaelde cer_.

Hvis der kun er CER ting i databasen er det overfloedigt.

Og hvis der er baade CER ting og FOOBAR ting i databasen, saa vil jeg foreslaa at skifte til to databaser.

Prefix giver kun mening hvis du har rigtigt mange tabeller som hoerer sammen men hvor brug af prefix for grupper af tabeller kan hjaelpe med at finde rundt. Men her taler jeg om >1000 tabeller.
Avatar billede arne_v Ekspert
09. december 2016 - 19:32 #8
SELECT *

har vist aldrig vaeret comme-il-faut.

Den vil ofte hente flere kolonner end noedvendigt aka belaste netvaerket mellem applikation og database mere end noedvendigt.

Hvis du refererer til query output via index i.s.f. navn, saa er * en garanti for at ingen kan laese koden.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester