Yii Framework Forum: Struktura bazy danych - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Struktura bazy danych Rate Topic: -----

#1 User is offline   Tru 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 14
  • Joined: 06-July 09

Posted 22 July 2009 - 06:32 AM

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);

0

#2 User is offline   sidewinder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 210
  • Joined: 08-July 09
  • Location:Poland

Posted 24 July 2009 - 06:51 AM

Witam Tru,

Quote

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.


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.

Quote

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

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

Quote

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

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

Quote

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

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.
---------------------------------------------------------------------
"Never memorize what you can look up in books."
Albert Einstein
0

#3 User is offline   Tru 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 14
  • Joined: 06-July 09

Posted 25 July 2009 - 08:04 AM

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

Quote

2. The columns referenced must be indexed. (show index from tablename)

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

#4 User is offline   sidewinder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 210
  • Joined: 08-July 09
  • Location:Poland

Posted 25 July 2009 - 08:38 AM

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

Quote

InnoDB requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. (This is in contrast to some older versions, in which indexes had to be created explicitly or the creation of foreign key constraints would fail.) index_name, if given, is used as described previously.


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

Quote

KEY is normally a synonym for INDEX.


Dwie pierwsze tabele z bloga:

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
      );
      


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.
---------------------------------------------------------------------
"Never memorize what you can look up in books."
Albert Einstein
0

#5 User is offline   Tru 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 14
  • Joined: 06-July 09

Posted 25 July 2009 - 03:43 PM

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

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users