Struktura bazy danych

Witam panowie,

na początku chciałem zaznaczyć, że jestem dosyć nowy i jeszcze do końca niekumaty (prawdopodobnie ze względu na mój wiek). Tworzę sobie nowy projekt oparty na Yii. Przyszła pora na sprawdzenie tego co wyknociłem w pliku /protected/data/schema.mysql.sql - z ciekawości porównałem to z dołączonym plikiem bazy w demo bloga. I teraz tak, struktura blogowej bazy danych ma takie linijki:


CONSTRAINT FK_post_author FOREIGN KEY (authorId)

	REFERENCES User (id) ON DELETE CASCADE ON UPDATE RESTRICT

Próbowałem szukać informacji na ten temat w dokumentacji mysql’a, jednak poległem.

Tu moje pytania:

  • o co chodzi z tym CONSTRAINT FK_post_author i czy ma to jakiś wpływ na działanie aplikacji?

  • ON UPDATE RESTRICT, z czym się to je?

  • czy wykluczając CONSTRAINT (alias) i ON UPDATE RESTRICT z mojego pliku będę zmuszony robić jakieś ‘myki’ podczas pisania aplikacji?

I jeszcze z innej beczki:

  • czy jest jakaś zasadnicza różnica między używaniem createCommand("suchy sql + zmienne") a używaniem $criteria?



<?php 		

$criteria=array(

			'condition'=>'Comment.status='.self::STATUS_APPROVED,

			'order'=>'Comment.createTime DESC',

			'limit'=>$limit,

		);

		return $this->with('post')->findAll($criteria);



Witam Tru,

Proszę bardzo :) .

http://dev.mysql.com…onstraints.html

W dokumentacji jest trochę suchych danych i opis składni. Żeby zrozumieć klucze zewnętrzne (albo klucze obce jak też się je czasem nazywa) dobrze przeanalizować jakiś przykład. Tutorial bloga w naszym Yii coś tam da, ale polecam na przykład to:

http://blog.ffff.ca/…-keys-in-mysql/

przykład to banalny, ale przynajmniej będziesz wiedział o co chodzi.

Mówiąc w skrócie.

jest to definicja klucza obcego i może mieć bardzo duży wpływ na działanie aplikacji.

Z kluczami obcymi, rzecz jasna :) . Jest to wyjaśnione w dokumentacji mysql.

Raczej tak. Klucze zewnętrzne mają za zadanie utrzymać spójność danych przechowywanych w bazie. Na przykład, jeżeli masz post w blogu i szereg komentarzy do tego posta, to usuwając post chcesz aby komentarze z nim powiązane zostały także usunięte i nie zaśmiecały bazy danych. Do tego właśnie służą klucze obce. Jeżeli ich nie użyjesz, to będziesz musiał usunąć te komentarze ręcznie, tzn. w php.

W linku, który podałeś http://blog.ffff.ca/2009/02/23/using-foreign-keys-in-mysql/ jest

a w /demo/blog/protected/data/schema.mysql.sql nie widziałem żeby było tam jakiekolwiek indeksowanie.

Trzeci podpunkt z podręcznika MySQL, dział o kluczach obcych:

Cytat z podręcznika MySQL, dział o tworzeniu tabel http://dev.mysql.com…eate-table.html

Dwie pierwsze tabele z bloga:

[sql]CREATE TABLE User

  (


      id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,


      username VARCHAR(128) NOT NULL,


      password VARCHAR(128) NOT NULL,


      email VARCHAR(128) NOT NULL,


      profile TEXT


  );


  


  CREATE TABLE Post


  (


      id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,


      title VARCHAR(128) NOT NULL,


      content TEXT NOT NULL,


      contentDisplay TEXT,


      tags TEXT,


      status INTEGER NOT NULL,


      createTime INTEGER,


      updateTime INTEGER,


      commentCount INTEGER DEFAULT 0,


      authorId INTEGER NOT NULL,


      CONSTRAINT FK_post_author FOREIGN KEY (authorId)


          REFERENCES User (id) ON DELETE CASCADE ON UPDATE RESTRICT


  );


  [/sql]

Z tego wynika, że kolumna authorId w tabeli Post zostanie zindeksowana automatycznie.

Kolumna id w tabeli User jest kluczem podstawowym, co oznacza, że jest indeksowana.

Dobrze jest taki przykładowy kod sql zaimportować do bazy i potem sprawdzić co i jak powstało i gdzie. Mam nadzieję, że korzystasz z narzędzi typu phpMyadmin albo MySQL Workbench a nie tylko z konsoli.

Okej, wielkie dzięki za wyjaśnienie. Trochę mi się przejaśniło :)