1

私は少し混乱していますカテゴリデータベース構造の最良の解決策は何ですか。ここに、次のカテゴリ リストがあります。

  1. ニュース

    1.1 一般ニュース

    1.2 エンターテイメント ニュース

    1.3 スポーツニュース

  2. ホロスコープ

    2.1 毎日のホロスコープ

      2.1.1 Aries
    
      2.1.2 Taurus
    
      2.1.3 Gemini
    
       .....
    
      2.1.12 Pisces
    

    2.2 ウィークリーホロスコープ

      2.2.1 Aries
    
      2.2.2 Taurus
    
      2.2.3 Gemini
    
       .....
    
      2.2.12 Pisces
    
  3. ジョーク

これが私の現在のカテゴリーリストです。ここでは、カテゴリとサブカテゴリを追加できる管理パネルを構築する必要があります。現在、ホロスコープの 2 つのサブカテゴリがあります。将来的には、たとえば、毎月および毎年のホロスコープなどのサブカテゴリを追加することができます。もう 1 つの混乱は、毎日と毎週のホロスコープに同じサブカテゴリがあることです。これは、単一のサブカテゴリに複数の親カテゴリがあることを意味します。ここで、データベーステーブルの重複をなくすにはどうすればよいでしょうか。再帰関数を使用してツリー構造でカテゴリを表示する必要があります。解決策をグーグルで検索しましたが、適切な答えが見つかりませんでした。これに関連する回答またはリンクを教えてください。私はphpとMSサーバーデータベースでコーディングしています。

4

5 に答える 5

1

一般的なテーブル式を使用した SQL 2005 の再帰クエリに関する記事を次に示します。

http://www.sqlservercentral.com/articles/T-SQL/recursivequeriesinsql1999andsqlserver2005/1846/

ニュースレターに登録することをお勧めします。これは、ほぼ毎日、役立つ可能性のある新しいものです。

于 2012-04-25T06:52:02.180 に答える
1

id、parent_id、および title の各フィールドを持つカテゴリ テーブルを作成し、各カテゴリに最上位カテゴリの parent_id または 0 を設定してみてください。

タイトルを id とタイトルを保持する別のテーブルにしたい場合は、カテゴリ テーブルでタイトル テーブルの適切なタイトルを参照できます。

考えてみてください。まさにあなたが探しているものであるこのルールセットに従います。

  • 各カテゴリは、0 個以上のカテゴリに関連付けられています。
  • 各カテゴリは 1 つのタイトルに関連付けられています。
  • 各タイトルは、1 つ以上のカテゴリに関連付けられています。

再帰的に表現することに関しては、この方法はかなり簡単です。それがうまくいくことを願っています。

于 2012-04-25T06:40:34.003 に答える
1

ここに私が数年前に書いたいくつかの醜いコードがあります...しかし、それはハウツーとしてあなたを助けるかもしれません

DBテーブル「table_name」の構造

ID  PARENT  NAME
1     0      1
2     0      2
3     1      1.1
4     1      1.2
5     4      1.2.1
6     4      1.2.2
7     2      2.1

データの取得と準備

$Select = mysql_query("SELECT * FROM table_name");
while($Row = mysql_fetch_assoc($Select)){
  if($Row['parent'] == 0){
    $Arr[$Row['id']] = $Row['name'];
  }else{
    $Childs[$Row['parent']][$Row['id']] = $Row['name'];
  }
}

ばかげているが十分な機能

function gettree($Array){
  global $Childs;
  foreach($Array as $key => $value){
    echo '<li>'.$value.'</li>';
    if(isset($Childs[$key])){
      echo '<li><ul>';
      gettree($Childs[$key]);
      echo '</ul></li>';
    }
  }
}

および構築ツリーをhtmlに

echo '<ul>';
gettree($Arr);
echo '</ul>';

結果は次のようになります

1
 1.1
 1.2
  1.2.1
  1.2.2
2
 2.1

より適切に使用するために、オブジェクトに書き直すことをお勧めします

私の英語でごめんなさい

于 2012-04-25T07:47:17.440 に答える
0

これは私のために働きます:

CREATE TABLE [dbo].[Category](
[id] [int] IDENTITY(1,1) NOT NULL,
[Cat_Id] [int] NOT NULL,
[Cat_Nm] [varchar](50) NOT NULL,
[Parent_Id] [int] NULL,
 CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

/****** Object:  Index [IX_Category]    Script Date: 04/25/2012 07:30:14 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_Category] ON [dbo].[Category] 
(
[Cat_Id] ASC,
[Cat_Nm] ASC,
[Parent_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Category]  WITH CHECK ADD  CONSTRAINT [FK_Category_Category] FOREIGN KEY([Parent_Id])
REFERENCES [dbo].[Category] ([id])
GO
ALTER TABLE [dbo].[Category] CHECK CONSTRAINT [FK_Category_Category]

GO

SET IDENTITY_INSERT [dbo].[Category] ON;
INSERT INTO [dbo].[Category]([id], [Cat_Id], [Cat_Nm], [Parent_Id])
SELECT 9, 1, N'Aries', 7 UNION ALL
SELECT 12, 1, N'Aries', 8 UNION ALL
SELECT 7, 1, N'Daily', 2 UNION ALL
SELECT 4, 1, N'General News', 1 UNION ALL
SELECT 1, 1, N'News', NULL UNION ALL
SELECT 5, 2, N'Enterntainment News', 1 UNION ALL
SELECT 2, 2, N'Horoscope', NULL UNION ALL
SELECT 10, 2, N'Taurus', 7 UNION ALL
SELECT 13, 2, N'Taurus', 8 UNION ALL
SELECT 8, 2, N'Weekly', 2 UNION ALL
SELECT 11, 3, N'Gemini', 7 UNION ALL
SELECT 14, 3, N'Gemini', 8 UNION ALL
SELECT 3, 3, N'Jokes', NULL UNION ALL
SELECT 6, 3, N'Sports News', 1
SET IDENTITY_INSERT [dbo].[Category] OFF;

GO

CREATE VIEW Categories
AS
    WITH    cte ( id, Cat_Id, [Name], [Level] )
              AS ( SELECT   id ,
                        Cat_Id ,
                        Cat_Nm ,
                        CAST(Cat_Id AS VARCHAR(5))
               FROM     dbo.Category c
               WHERE    Parent_Id IS NULL
               UNION ALL
               SELECT   c.id ,
                        c.Cat_Id ,
                        c.Cat_Nm ,
                        CAST(ct.[Level] + '.'
                        + CAST(c.Cat_Id AS VARCHAR(5)) AS VARCHAR(5))
               FROM     dbo.Category c
                        JOIN cte ct ON c.Parent_Id = ct.id
               WHERE    c.Parent_Id IS NOT NULL
             )
SELECT  Level ,
        Name
FROM    cte
于 2012-04-25T14:38:04.857 に答える
0

あなたのデータベース構造は、親に関連するIDを含み、管理パネルでselectboxの親カテゴリとサブ親カテゴリを取得する必要があります

USE `database`;


CREATE TABLE `category` (
`c_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `category_name` varchar(255) DEFAULT NULL,
 `status` enum('active','inactive') DEFAULT 'active',
 PRIMARY KEY (`c_id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

/*Data for the table `category` */

insert  into `category`(`c_id`,`category_name`,`status`) values (1,'For Sale','active'),(2,'Community','active'),(3,'Classes','active'),(4,'Vehicles','active'),(5,'Real Estate','active'),(6,'Services','active'),(7,'Matrimonial','active'),(8,'Jobs','active');
CREATE TABLE `sub_category` (
`sub_cat_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`c_id` int(11) DEFAULT NULL,
`sub_category_name` varchar(255) DEFAULT NULL,
`status` enum('active','inactive') DEFAULT 'active',
PRIMARY KEY (`sub_cat_id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

/*Data for the table `sub_category` */

insert  into `sub_category`(`sub_cat_id`,`c_id`,`sub_category_name`,`status`) values (1,1,'Animals','active'),(2,1,'Art - Collectibles','active'),(3,1,'Books - Magazines','active'),(4,1,'Business - Industrial','active'),(5,4,'Cars','active'),(6,4,'Truck','active');
/*Table structure for table `sub_category_child` */
CREATE TABLE `sub_category_child` (
`sub_category_child_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`c_id` int(11) DEFAULT NULL,
 `sub_cat_id` int(11) DEFAULT NULL,
`sub_category_child_label` varchar(255) DEFAULT NULL,
`nature` varchar(20) DEFAULT NULL,
`status` enum('active','inactive') DEFAULT 'active',
 PRIMARY KEY (`type_id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

insert  into `sub_category_child`(`sub_category_child_id`,`c_id`,`sub_cat_id`,`sub_category_child_label`,`nature`,`status`) values (1,4,5,'Make','parent','active'),(2,4,5,'Model','child','active'),(3,4,5,'doors','independent','active'),(4,4,5,'accessories','independent','active'),(5,1,1,'abc','parent','active'),(6,4,6,'No of Tyre','parent','active'),(8,4,6,'loader','independent','active');
于 2012-04-25T07:09:19.067 に答える